I usually create custom structs when grouping values of different types together. This is usually fine, and I personally find the named member access easier to read, but I wanted to create a more general purpose API. Having used tuples extensively in other languages I wanted to return values of type std::tuple but have found them much uglier to use in C++ than in other languages.
What engineering decisions went into making element access use an integer valued template parameter for get as follows?
#include <iostream> #include <tuple> using namespace std; int main() { auto t = make_tuple(1.0, "Two", 3); cout << "(" << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << ")\n"; } Instead of something simple like the following?
t.get(0) or
get(t,0) What is the advantage? I only see problems in that:
- It looks very strange using the template parameter like that. I know that the template language is Turing complete and all that but still...
- It makes indexing by runtime generated indices difficult (for example for a small finite ranged index I've seen code using switch statements for each possibility) or impossible if the range is too large.
Edit: I've accepted an answer. Now that I've thought about what needs to be known by the language and when it needs to be known I see it does make sense.
get<N>).