#include <tuple>
#include <iostream>

using namespace std;
// 由于std::get<size_t>(t)的语法中是size_t必须在编译的时候确定,所以无法传左值。
// 借助模板中的可变模板参数递归实现
template<typename Tuple, size_t N>
struct tuple_print
{
    static void print(const Tuple& t, std::ostream& os)
    {
        tuple_print<Tuple, N-1>::print(t, os);
        os << ", " << std::get<N-1>(t);
    }
};
// 类模板的特化版本
template<typename Tuple>
struct tuple_print<Tuple, 1>
{
    static void print(const Tuple& t, std::ostream& os)
    {
        os << std::get<0>(t);
    }
};

// operator<<
template<typename... Args>
std::ostream& operator<<(std::ostream& os, const std::tuple<Args...>& t)
{
	os << "[";
    tuple_print<decltype(t), sizeof...(Args)>::print(t, os);
    os << "]";
    return os;
}

int main(int argc, char const *argv[])
{
	auto tup = make_tuple("sdfsd",1,3);

	cout << tup << endl;
	return 0;
}


备份地址: 【c++11遍历打印tuple(借助模版参数)