Re: tuples in C++11
On 2012-08-14 13:17, Single Stage to Orbit wrote:
Is it even possible to have something like this:
for (auto& i : tuples)
{
for (unsigned j = 0; j < 3; ++j)
{
std::cout << i.get<j>();
if (j < 3)
std::cout << " ";
}
std::cout << '\n';
}
It's possible if you convert the iteration into recursion, and implement
the recursion with some nasty template meta-programming:
#include <iostream>
#include <tuple>
#include <vector>
template <std::size_t Index, std::size_t Max, typename Tuple>
struct dump_helper
{
static void dump(std::ostream& os, const Tuple& t)
{
if (Index > 0)
os << ' ';
os << std::get<Index>(t);
dump_helper<Index+1,Max,Tuple>::dump(os, t);
}
};
template <std::size_t Max, typename Tuple>
struct dump_helper<Max,Max,Tuple>
{
static void dump(std::ostream&, const Tuple&)
{}
};
template <typename... Args>
inline void dump(std::ostream& os, const std::tuple<Args...>& t)
{
typedef std::tuple<Args...> Tuple;
dump_helper<0,sizeof...(Args),Tuple>::dump(os, t);
}
int main()
{
typedef std::tuple<int, int, int> tuple3;
std::vector<tuple3> tuples;
tuples.push_back(tuple3(1, 2, 3));
tuples.push_back(tuple3(7, 8, 9));
tuples.push_back(tuple3(4, 5, 6));
for (const auto& i : tuples)
{
dump(std::cout, i);
std::cout << '\n';
}
return 0;
}