#include <iostream>
#include <tuple>
using namespace std;
// bar : does something with an arbitrary tuple
// (no variadic template arguments)
template <class Tuple>
void bar(Tuple t)
{
// .... do something with the tuple ...
std::cout << std::tuple_size<Tuple>::value;
}
// foo : takes a function pointer and an arbitrary number of other
// arguments
template <class Func, typename... Ts>
void foo(Func f, Ts... args_in)
{
// construct a tuple containing the variadic arguments
std::tuple<Ts...> t = std::make_tuple(args_in...);
// pass this tuple to the function f
f(t);
}
int main()
{
// this is not highly refined; you must provide the types of the
// arguments (any suggestions?)
foo(bar<std::tuple<int, const char *, double>>, 123, "foobar", 43.262);
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCSNpbmNsdWRlIDx0dXBsZT4KCXVzaW5nIG5hbWVzcGFjZSBzdGQ7CgkKICAgIC8vIGJhciA6IGRvZXMgc29tZXRoaW5nIHdpdGggYW4gYXJiaXRyYXJ5IHR1cGxlCiAgICAvLyAobm8gdmFyaWFkaWMgdGVtcGxhdGUgYXJndW1lbnRzKQoJdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgoJdm9pZCBiYXIoVHVwbGUgdCkKCXsKICAgICAgICAvLyAuLi4uIGRvIHNvbWV0aGluZyB3aXRoIHRoZSB0dXBsZSAuLi4KCQlzdGQ6OmNvdXQgPDwgc3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWU7Cgl9CgkKICAgIC8vIGZvbyA6IHRha2VzIGEgZnVuY3Rpb24gcG9pbnRlciBhbmQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBvdGhlcgogICAgLy8gYXJndW1lbnRzCgl0ZW1wbGF0ZSA8Y2xhc3MgRnVuYywgdHlwZW5hbWUuLi4gVHM+Cgl2b2lkIGZvbyhGdW5jIGYsIFRzLi4uIGFyZ3NfaW4pCgl7CiAgICAgICAgLy8gY29uc3RydWN0IGEgdHVwbGUgY29udGFpbmluZyB0aGUgdmFyaWFkaWMgYXJndW1lbnRzCgkJc3RkOjp0dXBsZTxUcy4uLj4gdCA9IHN0ZDo6bWFrZV90dXBsZShhcmdzX2luLi4uKTsKCiAgICAgICAgLy8gcGFzcyB0aGlzIHR1cGxlIHRvIHRoZSBmdW5jdGlvbiBmCgkJZih0KTsKCX0KCQoJaW50IG1haW4oKQoJewogICAgICAgIC8vIHRoaXMgaXMgbm90IGhpZ2hseSByZWZpbmVkOyB5b3UgbXVzdCBwcm92aWRlIHRoZSB0eXBlcyBvZiB0aGUKICAgICAgICAvLyBhcmd1bWVudHMgKGFueSBzdWdnZXN0aW9ucz8pCgkJZm9vKGJhcjxzdGQ6OnR1cGxlPGludCwgY29uc3QgY2hhciAqLCBkb3VibGU+PiwgMTIzLCAiZm9vYmFyIiwgNDMuMjYyKTsKCQlyZXR1cm4gMDsKCX0=