5 ms·
C++26 Reflections adventures and compile-time UML
- tombert 1y agoI had to do a UML thing for the first time in years for a class a few weeks ago[2]. I'm not 100% convinced that UML is actually useful at all. Obviously if you find value from it, don't let me take that from you, by all means keep doing it, but all it seemed to provide was boxes pointing to other boxes for stuff that really wasn't unclear from looking directly at the code anyway. It's really not that hard to look directly at the class and look directly at the "extends" keyword (or the equivalent for whatever language you're using) and then follow from there. Maybe if you had like ten layers of inheritance it could be valuable, but if you're doing ten layers of inheritance there's a good chance that your code will be incomprehensible regardless. I'm not against visual diagrams for code, I draw logic out with Draw.io all the time and I've been hacking on the RoboTool [1] toolkit a bit in my free time, but what UML offers always felt more masturbatory than useful. Maybe I'm wrong, it certainly wouldn't be the first time, but every time I've tried to convince myself to like it I've left a little disappointed. It always kind of felt like stuff the enterprise world does to look like they're working hard and creating value. [1] https://robostar.cs.york.ac.uk/robotool/ https://robostar.cs.york.ac.uk/robotool/ ETA: [2] By "class", I meant like an education class, not a Java class.*
- secondcoming 1y agoUML diagrams are the only pictures that DON’T paint a thousand words
- devjab 1y agoFor many of us UML has been completely irrelevant for decades. If you're deep down the OOP rabbit hole, then UML can have it's place in helping you keep track of your hierarchies. If you use it then I'd assume that getting your process of keeping it updated as automated as possible would be a high priority, unless you want it to rod in some ivory tower. Personally I view architecture in UML, ArchiMate or draw.io rather than being build with something similar icepanel.io to be a complete waste of my time. But that's just me.
- burnt-resistor 1y agoRemember when people used tools like Rational Rose to satisfy project managers and pointy-hair bosses? And not to satisfy documentation requirements for critical safety systems.
- rramadass 1y agoYou have to rethink your view and understanding of UML - https://en.wikipedia.org/wiki/Unified_Modeling_Language https://en.wikipedia.org/wiki/Unified_Modeling_Language It is not just drawing boxes but a visual modeling language providing both static/structural and dynamic/behavioural views of a complete system. You will only understand its value when you actually deal with large systems consisting of many interconnected modules with dependencies. In such large codebases it is almost impossible to understand all structural/behavioural aspects by browsing code whereas a tool like Doxygen generating UML diagrams from code becomes a godsend. You can map from UML to Code or Code to UML. As with any language you don't have to know all of it but can focus only on what you need eg. Class diagram/Activity diagram/Statemachine diagram are the ones i have found most useful. Finally, UML is now being used as a modeling/specification language frontend to Formal Methods which is the ultimate proof of its usefulness.
- ok123456 1y agoIn wider practice, UML (class diagrams) is never used by working software developers as a frontend to formal methods. It got pushed on everyone, so there could be a layer of "software architects" who didn't have to know how to code and could have endless meetings where the final product was a Bayeux Tapestry of UML. UML captures inheritance and composition well, but a program is more than the sum of its schema. Also, real programming languages all have their idioms, and using UML as the design space creates a significant impedance mismatch.
- rramadass 1y agoIt is the complete modeling language (class diagram is just one artifact) that people are looking at using with Formal Methods along with regular Software Engineering. For example Sequence Diagrams are extremely useful in understanding the dynamic nature of a System. Lots of papers have been published, IEEE workshops and there is even an attempt at integrating the B Method with UML to give a UML-B variant. Like any language it is up to the developer to study it and learn to use it productively in his work. Of course it is not the "in thing" but quite useful nonetheless when used appropriately. Automatic Formal Model Generation from UML Diagrams – An Implementation Experience - https://ieeexplore.ieee.org/document/9753518 https://ieeexplore.ieee.org/document/9753518 UML-B: Formal modelling and design aided by UML - pdf at https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=9ec66aca71e91ceb6f881891e539341b2ddce854 https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&d...
- matt123456789 1y agoWhenever I start to feel like a real programmer making games and webapps and AI-enhanced ETL pipelines, I inevitably come across the blog post of a C++ expert and reminded that I am basically playing with legos and play-doh.
- tombert 1y agoI'm not a C++ developer at all, but unless I'm missing something this didn't seem terribly difficult? This isn't meant to make myself seem smart or to try and make you seem dumb, I'm just curious what was confusing about this even from a high-level perspective. It felt like a clever but not too atypical metaprogramming thing. Maybe I've just done too much Clojure.
- lmariscal 1y agoI would argue that C++ expertise doesn't necessarily correlate to the complexity of the software being developed. Although I do try to learn the fancy new features I know many developers who even though they are still only using C++11 features they are creating some very complex and impactful pieces of software.
- lanyard-textile 1y agoI definitely think that’s not a coincidence. C++11 is where you get the most useful feature tradeoffs with reasonable costs. Smart pointers being a great example. Shared ptr has its issues, it isn’t the most performant choice in most cases, but it by far reduces more footguns than it introduces. Compared to something like std::variant in the C++17 standard that comes with poor enough performance issues that it’s rarely ever a good fit.
- otabdeveloper4 1y agoJust because someone didn't bother to learn anything past C++11 doesn't mean C++11 is some sort of performance sweet spot.
- jandrewrogers 1y ago
- edg5000 1y agoReflection really was the missing piece, it's one of the things that are so nice in Java. Being able to serialize/deserialize a struct to JSON fully dynamically saves a lot of code.
- peapicker 1y agoStill waiting for IBMi to support C++11.
- delusional 1y agoThis is interesting because it interacts with consteval. It would be cool if the standards committee could so somehow figure out how to do codegen from consteval. Then we'd be kinda close to the promised land of procedural macros written in real C++.
- theICEBeardk 1y agoA lot of the stuff they are working on for c++29 is exactly what you are wishing for (me too by the way).
- a_t48 1y agoOh man, some of the code in the linked proposal: Old: template<class...> struct list {}; using types = list<int, float, double>; constexpr auto sizes = []<template<class...> class L, class... T>(L<T...>) { return std::array<std::size_t, sizeof...(T)>{{ sizeof(T)... }}; }(types{}); New: constexpr std::array types = {^^int, ^^float, ^^double}; constexpr std::array sizes = []{ std::array<std::size_t, types.size()> r; std::ranges::transform(types, r.begin(), std::meta::size_of); return r; }(); I'm so tired of parameter packs, as useful as they are. Just give me a regular range based for loop or something similar like this. Thank you, this can't come soon enough.
- einpoklum 1y agoBut the standard library should have had things so that we can write: constexpr std::array types = {^^int, ^^float, ^^double}; auto sizes = std::whatever::transform(types, std::meta::size_of); which would have been even nicer.
- a_t48 1y agoIt would have been, but it looks like the difficulty there is that the type of `sizes` must be compile time known, but `std::transform` and friends don't really know about fixed sizes. Depending on the context, one can do `auto sizes = types | std::views::transform(std::meta::size_of);`, the difficulty comes in materializing at the end.
- a_t48 1y agoThinking about this more, for consteval this should work - huh
- wslh 1y agoThis is when I switch to a programming language that doesn't block me from compiling and running just because I forgot some intricate detail. Ironically, I often find assembly programming much friendly. BTW, I continue to maintain some C++ software, and I like cryptopp [1]. I know people now use libsodium. [1] https://github.com/weidai11/cryptopp https://github.com/weidai11/cryptopp
- criddell 1y agoIf you’re like me and haven’t read much about this feature, here’s a link to the committee’s paper: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2996r12.html https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p29... The examples section was pretty helpful for me.
- dgfitz 1y agoMeta: why does c++ feel almost political on this forum?
- theICEBeardk 1y agoc++ gets a lot of hate much of it based on past traumas with specific codebases and history of use. This has built up into a culture where people who have little to no experience with c++ but who have been told and seen only bad headlines about it join in with those who have legitimate concerns, those who are promoting their favorite language and those who are trolls leading to a general mood. It is almost perfectly predictable that if you open the discussion on a link to a c++ article on this site there will be someone promoting either zip, rust or circle in that discussion. There will also be a comment on the bloat of the language and someone venting their trauma from some horrible code base.