#include <functional>
#include <string>
#include <tuple>
#include <iostream>
using namespace std;
template<typename ...Args>
struct TypeList {};
typedef TypeList<int, float, string> Types;
template <typename ...Args>
struct MakeTupleOfTypes;
template <typename ...Args>
struct MakeTupleOfTypes<TypeList<Args...>>
{
typedef tuple<Args...> type;
};
template <typename ...Args>
struct MakeTupleOfFunction;
template <typename ...Args>
struct MakeTupleOfFunction<TypeList<Args...>>
{
typedef tuple<function<void(Args)>...> type; // <-- VS2013 error here
};
typedef TypeList<int, float, string> Types;
typedef MakeTupleOfTypes<Types>::type TupleOfTypes;
typedef MakeTupleOfFunction<Types>::type TupleOfFunctions;
void f1(int x) { cout << x << endl; }
void f2(float x) { cout << x << endl; }
void f3(string x) { cout << x << endl; }
int main()
{
TupleOfTypes values;
get<0>(values) = 42;
get<1>(values) = 3.14159;
get<2>(values) = "Hello, World!";
TupleOfFunctions functions;
get<0>(functions) = &f1;
get<1>(functions) = &f2;
get<2>(functions) = &f3;
get<0>(functions)(get<0>(values));
get<1>(functions)(get<1>(values));
get<2>(functions)(get<2>(values));
return 0;
}