使用Ubuntu16.04 gcc -std11编译通过
#include <tuple>
#include <type_traits>
#include <iostream>
#include <string>
using namespace std;
template<size_t N>
struct print_tuple {
template<typename... T>
static
typename enable_if<(N < sizeof...(T))>::type
print(ostream &os, const tuple<T...> &t) {
os << ", " << get<N>(t);
print_tuple < N + 1 > ::print(os, t);
}
template<typename... T>
static
typename enable_if<!(N < sizeof...(T))>::type
print(ostream &os, const tuple<T...> &) {
}
} ;
ostream& operator<<(ostream& os, const tuple<>&) {
os << "{}";
}
template<typename T0, typename... T>
ostream& operator<<(ostream& os, const tuple<T0, T...>& t) {
os << '{' << get<0>(t);
print_tuple<1>::print(os, t);
os << '}';
}
template<size_t N>
struct set_tuple {
template<typename Head, typename... Tail>
static
typename enable_if<(N < sizeof...(Tail))>::type
set(tuple<Tail...> &rt, const tuple<Head, Tail...> &t) {
get<N>(rt) = get < N + 1 > (t);
set_tuple < N + 1 > ::set(rt, t);
}
template<typename Head, typename... Tail>
static
typename enable_if<!(N < sizeof...(Tail))>::type
set(tuple<Tail...> &, const tuple<Head, Tail...> &) {
}
} ;
tuple<> mytail(const tuple<> &t) {
return tuple<>();
}
template<typename Head, typename... Tail>
tuple<Tail...> mytail(const tuple<Head, Tail...> &t) {
tuple<Tail...> rt;
set_tuple<0>::set(rt, t);
return rt;
}
int main(int argc, char** argv) {
auto t1 = make_tuple(1, 1.2, "hello", -0x123456);
cout << t1 << endl;
cout << mytail(t1) << endl;
return 0;
}