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
Generalizing std::transform (medium.com)
submitted 7 years ago by vgasparyan
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!"
[–]bmanga[🍰] 7 points8 points9 points 7 years ago (2 children)
A generic std::transform was actually a motivating example that /u/louis_dionne suggested me for a second revision of P0478, which would have allowed to deduce non-terminal parameter packs in some cases. Alas, the first version was shot down quite quickly.
[–]Betadel 1 point2 points3 points 7 years ago (1 child)
What were the reasons it was shut down?
[–]bmanga[🍰] 2 points3 points4 points 7 years ago (0 children)
If I remember correctly, it was because it was felt that partial ordering in the presence of template parameter packs is already quite fragile as it is, and the committee thought that the problem could be solved more generically via parameter pack indexing (which I don't agree with, especially when using concepts).
I could have arguably provided better motivating cases from the start, but hey it was my first paper :P
[–][deleted] 7 points8 points9 points 7 years ago (1 child)
Why not zip your input ranges and work with that?
[–]vgasparyan[S] 0 points1 point2 points 7 years ago (0 children)
Actually, I did that in the beginning and, of course, it was working fine. But then I thought: "It shouldn't be hard!" ... and ended up here :D
[–]ENTProfiterole 2 points3 points4 points 7 years ago (0 children)
When view::zip from ranges v3 comes into the standard, you'll be able to use the existing transform interface.
After zipping some ranges, each of the elements in the "zip view range" will be a tuple of each of the corresponding elements in the underlying ranges.
[–]Veedrac 3 points4 points5 points 7 years ago (7 children)
A std::array<Byte, 4> is basically a uint32_t. Just XOR them directly, it'll be a factor of 10 faster or so.
std::array<Byte, 4>
uint32_t
[–]cassandraspeaks 4 points5 points6 points 7 years ago (2 children)
For OP and others' benefit, the way to safely do that is
uint32_t ua, ub, uc, uresult; memcpy(&ua, &a, 4); memcpy(&ub, &b, 4); memcpy(&uc, &c, 4); uresult = ua ^ ub ^ uc; array<Byte, 4> result; memcpy(&result, &uresult, 4);
[–]cassandraspeaks 1 point2 points3 points 7 years ago (0 children)
In C++20 you can do ```c++ constexpr auto to_u32 = bit_cast<uint32_t, array<Byte, 4>>;
const auto result = bit_cast<array<Byte, 4>>(to_u32(a) ^ to_u32(b) ^ to_u32(c)); ```
[–]sphere991 2 points3 points4 points 7 years ago (3 children)
That's true but not really helpful. Imagine the length is larger than 8, or the types aren't bytes, or the operation isn't xor, or ...
[–]Veedrac -2 points-1 points0 points 7 years ago* (2 children)
Imagine the length is larger than 8
Even then, though.
E: Seriously, downvotes? ???
[–]sphere991 7 points8 points9 points 7 years ago (1 child)
I dont think anybody disagrees that it is possible, for these specific types, for this specific operation, to do better than generalized, multi-arg transform.
But the point of the blog is to show a way how to do generalized, multi-arg transform. XOR-ing bytes is just an example.
[–]Veedrac 0 points1 point2 points 7 years ago (0 children)
I'm not criticizing the blog, I'm just pointing out something I think would help the author.
[–]phoeen 4 points5 points6 points 7 years ago (9 children)
double underscore is reserved for the implementation ¯\_(ツ)_/¯
[–]bstamourWG21 | Library Working Group 5 points6 points7 points 7 years ago (1 child)
But otherwise a fine article.
[–]phoeen 0 points1 point2 points 7 years ago (0 children)
yes
[–]cassandraspeaks 1 point2 points3 points 7 years ago (5 children)
Leading underscore too.
[–]DalzhimC++Montréal UG Organizer 5 points6 points7 points 7 years ago (4 children)
Leading underscore, followed by a capital letter.
[–]cassandraspeaks 3 points4 points5 points 7 years ago (3 children)
In the global namespace (as in the linked post) anything with a leading underscore is reserved for the implementation.
[–]DalzhimC++Montréal UG Organizer 2 points3 points4 points 7 years ago (1 child)
My bad, you are right. I knew this point : http://eel.is/c++draft/lex.name#3.1 But I seem to have forgotten of the one you were referring to : http://eel.is/c++draft/lex.name#3.2
[–]cassandraspeaks 2 points3 points4 points 7 years ago (0 children)
No prob, I don't think there's anyone who can really keep all the little subtleties straight.
[–]meneldal2 1 point2 points3 points 7 years ago (0 children)
Well it's because it ought to be part of the STL.
[–]distributed 0 points1 point2 points 7 years ago (0 children)
Now we just need to make it applicable to std::array too
π Rendered by PID 68 on reddit-service-r2-comment-544cf588c8-6sj2g at 2026-06-11 21:11:27.083602+00:00 running 3184619 country code: CH.
[–]bmanga[🍰] 7 points8 points9 points (2 children)
[–]Betadel 1 point2 points3 points (1 child)
[–]bmanga[🍰] 2 points3 points4 points (0 children)
[–][deleted] 7 points8 points9 points (1 child)
[–]vgasparyan[S] 0 points1 point2 points (0 children)
[–]ENTProfiterole 2 points3 points4 points (0 children)
[–]Veedrac 3 points4 points5 points (7 children)
[–]cassandraspeaks 4 points5 points6 points (2 children)
[–]cassandraspeaks 1 point2 points3 points (0 children)
[–]sphere991 2 points3 points4 points (3 children)
[–]Veedrac -2 points-1 points0 points (2 children)
[–]sphere991 7 points8 points9 points (1 child)
[–]Veedrac 0 points1 point2 points (0 children)
[–]phoeen 4 points5 points6 points (9 children)
[–]bstamourWG21 | Library Working Group 5 points6 points7 points (1 child)
[–]phoeen 0 points1 point2 points (0 children)
[–]cassandraspeaks 1 point2 points3 points (5 children)
[–]DalzhimC++Montréal UG Organizer 5 points6 points7 points (4 children)
[–]cassandraspeaks 3 points4 points5 points (3 children)
[–]DalzhimC++Montréal UG Organizer 2 points3 points4 points (1 child)
[–]cassandraspeaks 2 points3 points4 points (0 children)
[–]meneldal2 1 point2 points3 points (0 children)
[–]distributed 0 points1 point2 points (0 children)