using namespace std;
template <typename ... Tail> class Tuple;
template<> class Tuple<> {};
template <typename Value, typename ... Tail>
class Tuple<Value, Tail ...> : Tuple<Tail ...> {
Value Val;
public:
Tuple() {}
Tuple(Value value, Tail ... tail) : Val(value), Tuple<Tail ...>(tail ...) {
std::cout << "value:" << value << std::endl;
}
Value value() { return Val; }
Tuple<Tail ...>* next() { return this; }
};
class TestClass{
};
int test_func(int a, TestClass b) {
return 5;
}
int main() {
Tuple<char, double, std::string> tuple('1', 1.5, "Hello World");
std::cout << tuple.value() << std::endl;
std::cout << tuple.next()->value() << std::endl;
std::cout << tuple.next()->next()->value() << std::endl;
std::cout << typeid(decltype(test_func)).name() << std::endl;
return 0;
}