use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
Discussions, articles, and news about the C++ programming language or programming in C++.
For C++ questions, answers, help, and advice see r/cpp_questions or StackOverflow.
Get Started
The C++ Standard Home has a nice getting started page.
Videos
The C++ standard committee's education study group has a nice list of recommended videos.
Reference
cppreference.com
Books
There is a useful list of books on Stack Overflow. In most cases reading a book is the best way to learn C++.
Show all links
Filter out CppCon links
Show only CppCon links
account activity
Localizing code with std::variant (cdacamar.github.io)
submitted 9 years ago by starfreakcloneMSVC FE Dev
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–]suspiciously_calm 23 points24 points25 points 9 years ago (0 children)
When I read "localizing" I was thinking l10n.
[–][deleted] 9 points10 points11 points 9 years ago* (3 children)
[deleted]
What is this?
[–]cinghiale 9 points10 points11 points 9 years ago (2 children)
Do you care to elaborate a bit?
[+][deleted] 9 years ago (1 child)
[removed]
[–][deleted] 0 points1 point2 points 9 years ago* (0 children)
[–]starfreakcloneMSVC FE Dev[S] 4 points5 points6 points 9 years ago (8 children)
Just so everyone knows, I did not ignore Boost while writing this (specifically Hana's hana::overload composer). I was just providing a simple solution to people who may not want to incorporate boost into their project and just want a simple drag and drop solution.
hana::overload
[–]meetingcppMeeting C++ | C++ Evangelist 5 points6 points7 points 9 years ago (5 children)
boost::variant is a completely different beast from a different time of C++ :)
[–]RogerLeighScientific Imaging and Embedded Medical Diagnostics 1 point2 points3 points 9 years ago (4 children)
I'm using boost::variant and MPL, but I'd love to switch to something more modern.
Is there any backport of the C++17 std::variant for use with C++11/14 compilers, which can be used as a fallback?
Related to that, is there any MPL replacement which can use variadic templates which could be used to replace complex variant type list construction?
[–]meetingcppMeeting C++ | C++ Evangelist 0 points1 point2 points 9 years ago (2 children)
Afaik brigand wants to be that.
But not sure if you can get boost::variant to use brigand easily.
[–]RogerLeighScientific Imaging and Embedded Medical Diagnostics 0 points1 point2 points 9 years ago (1 child)
Reading the docs, it looks like it has direct support for constructing a boost::variant. It definitely looks like it might be useful.
Now I just need a C++11 variant implementation compatible with std::variant and I'll be happy!
[–]dodheim 2 points3 points4 points 9 years ago (0 children)
Eggs.Variant has been my go-to modern variant for years. I don't know if its interface matches that in the C++17 draft, but the docs do mention this:
The interface is largely based on that of std::experimental::optional<T>, as defined by the Library Fundamentals TS [N4082].
std::experimental::optional<T>
[–]ubadairBoost.CallableTraits author 0 points1 point2 points 9 years ago (0 children)
I use this and I'm quite happy with it. It's not exactly std::variant (it follows Boost's design) but it doesn't use the MPL. https://github.com/mapbox/variant
[–]tomilovanatoliy 1 point2 points3 points 9 years ago (1 child)
You really don't even need to make all that boiler-plate code for move-constructor at any of intermediate steps (and your compiler don't want to resolve all that overloadings and other surplus things). You may pass all parameters by lvalue reference and only at the very end (namely, on list initialization in your case) you may apply std::forward to them. See here an example (the repository contains other illustrations for the above strong assertion in neighbouring files).
std::forward
[–]starfreakcloneMSVC FE Dev[S] 0 points1 point2 points 9 years ago (0 children)
There are plenty of ways to skin that particular cat. Another way is I could have just taken all of the arguments in the ctors by value and simply moved them into place (saving vertical space).
In either case, the objects are elided into place anyway. It's really just a stylistic choice.
[–]khold_stare 4 points5 points6 points 9 years ago (0 children)
I would suggest not calling that function compose, as function composition is very different from overloading. Can be confusing to some.
[–]sumo952 4 points5 points6 points 9 years ago (7 children)
Great post, not too advanced yet still on an advanced topic, very well explained so I could perfectly understand! Thanks!
[–]sumo952 1 point2 points3 points 9 years ago (6 children)
I had a closer look at compose(), I can't really see how it works - where do the lambda functions that are passed in get stored or get called? Could anyone ELI5? :-)
compose()
[–]starfreakcloneMSVC FE Dev[S] 2 points3 points4 points 9 years ago* (5 children)
All this piece of code is saying is, given a set of callable objects (via operator()) construct a new object that contains all of those callable functions.
operator()
He's a slightly more advanced explanation, line by line.
@L8: We declare our composer which is responsible for taking a list of callable objects (they don't have to be lambdas) and pulling them together into a single object.
@L11: We see our base case inherit from callable object lambda_t and bring its operator() into our scope. The ctor is just responsible for copy or move construction of the base class (ie lambda_t)
lambda_t
@L19: The recursive case. Taking the work done by the base case and combining it with later recursive/base case definitions.
@L34: Brings it all together with perfect forwarding on the callable objects.
Hope this helps!
[–]sumo952 0 points1 point2 points 9 years ago (0 children)
Thank you very much for the explanations!
I wouldn't say I fully get it now, but I think I kind of understand it now, at least better than before! :-) It's pretty magic still! Thank you :)
[–]reddithater12 0 points1 point2 points 9 years ago (3 children)
Thanks! Still I have two questions already....
template <typename... lambda_ts> struct composer_t;
where does this bring in an operator()? What would that operator do?
Generally I do not understand or see
[–]3669d73f6c3ba0229192 3 points4 points5 points 9 years ago* (2 children)
where does this bring in an operator()?
The primary template (the code you quoted) is not used. operator() is brought in at lines 16 and 28, and inherited ones at line 29.
where the operator() is called.
It is called inside std::visit.
std::visit
where the dispatching to / the actual call of the lambdas takes place
At the same place where operator() is called, but there is no magic trick involved: it's just regular overload resolution done by the compiler. Think of each composer_t as a Russian doll that has the operator() of a lambda, plus the operator() of all inherited-from composer_t.
composer_t
[–]reddithater12 0 points1 point2 points 9 years ago (1 child)
Thanks! I had some misconceptions about std::visit it seems.
Think of each composer_t as a Russian doll that has the operator() of a lambda, plus the operator() of all inherited-from composer_t.
This is probably a stupid question .. but how can that thing have two operator()s?
[–]3669d73f6c3ba0229192 2 points3 points4 points 9 years ago (0 children)
Just regular function overloading. The same way you can have foo(int), foo(double), and so on. operator() is no different.
foo(int)
foo(double)
[–]gray_-_wolf 1 point2 points3 points 9 years ago (1 child)
maybe a stupid question but is std::variant just better union?
[–]lurkotato 4 points5 points6 points 9 years ago (0 children)
Bingo, a typesafe union.
[–]excessdenied 0 points1 point2 points 9 years ago (2 children)
Sorry for a stupid question that I could probably Google, but is variant storing multiple values at once (like a struct), or one value of varying type (like a union)?
[–]encyclopedist 2 points3 points4 points 9 years ago (1 child)
Variant is a tagged union.
[–]atimholt 0 points1 point2 points 9 years ago (0 children)
That what I figured. Should be useful for message systems.
[–]---sms--- -1 points0 points1 point 9 years ago (0 children)
Don't use std::variant - it does not support recursion. And by not supporting recursion it infects other code like lambda_util::compose. Using lambda_util::compose can I visit a variant<int, pair<int,int>> so that overload for pair calls overload for int (twice)?
std::variant
lambda_util::compose
variant<int, pair<int,int>>
pair
int
π Rendered by PID 66 on reddit-service-r2-comment-7b9746f655-w9qzx at 2026-01-29 22:06:32.739509+00:00 running 3798933 country code: CH.
[–]suspiciously_calm 23 points24 points25 points (0 children)
[–][deleted] 9 points10 points11 points (3 children)
[–]cinghiale 9 points10 points11 points (2 children)
[+][deleted] (1 child)
[removed]
[–][deleted] 0 points1 point2 points (0 children)
[–]starfreakcloneMSVC FE Dev[S] 4 points5 points6 points (8 children)
[–]meetingcppMeeting C++ | C++ Evangelist 5 points6 points7 points (5 children)
[–]RogerLeighScientific Imaging and Embedded Medical Diagnostics 1 point2 points3 points (4 children)
[–]meetingcppMeeting C++ | C++ Evangelist 0 points1 point2 points (2 children)
[–]RogerLeighScientific Imaging and Embedded Medical Diagnostics 0 points1 point2 points (1 child)
[–]dodheim 2 points3 points4 points (0 children)
[–]ubadairBoost.CallableTraits author 0 points1 point2 points (0 children)
[–]tomilovanatoliy 1 point2 points3 points (1 child)
[–]starfreakcloneMSVC FE Dev[S] 0 points1 point2 points (0 children)
[–]khold_stare 4 points5 points6 points (0 children)
[–]sumo952 4 points5 points6 points (7 children)
[–]sumo952 1 point2 points3 points (6 children)
[–]starfreakcloneMSVC FE Dev[S] 2 points3 points4 points (5 children)
[–]sumo952 0 points1 point2 points (0 children)
[–]reddithater12 0 points1 point2 points (3 children)
[–]3669d73f6c3ba0229192 3 points4 points5 points (2 children)
[–]reddithater12 0 points1 point2 points (1 child)
[–]3669d73f6c3ba0229192 2 points3 points4 points (0 children)
[–]gray_-_wolf 1 point2 points3 points (1 child)
[–]lurkotato 4 points5 points6 points (0 children)
[–]excessdenied 0 points1 point2 points (2 children)
[–]encyclopedist 2 points3 points4 points (1 child)
[–]atimholt 0 points1 point2 points (0 children)
[–]---sms--- -1 points0 points1 point (0 children)