#include <iostream>
#include <utility>
#include <tuple>
template<typename Ret, typename... Ts, size_t... I>
Ret callFunction_(Ret (*fn)(Ts...), std::tuple<Ts...> tup, std::index_sequence<I...>)
{
return fn(std::get<I>(tup)...);
}
template<typename Ret, typename... Ts, typename Tuple>
Ret callFunction(Ret (*fn)(Ts...), Tuple&& tup)
{
return callFunction_(fn, std::forward<Tuple>(tup),
std::make_index_sequence<std::tuple_size<Tuple>{}>{});
}
int foo(int x, int y) {return x * y;}
int main()
{
auto i = callFunction(foo, std::make_tuple(2, 3));
std::cout << i;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHR1cGxlPgogICAgCnRlbXBsYXRlPHR5cGVuYW1lIFJldCwgdHlwZW5hbWUuLi4gVHMsIHNpemVfdC4uLiBJPgpSZXQgY2FsbEZ1bmN0aW9uXyhSZXQgKCpmbikoVHMuLi4pLCBzdGQ6OnR1cGxlPFRzLi4uPiB0dXAsIHN0ZDo6aW5kZXhfc2VxdWVuY2U8SS4uLj4pCnsKICAgIHJldHVybiBmbihzdGQ6OmdldDxJPih0dXApLi4uKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgUmV0LCB0eXBlbmFtZS4uLiBUcywgdHlwZW5hbWUgVHVwbGU+ClJldCBjYWxsRnVuY3Rpb24oUmV0ICgqZm4pKFRzLi4uKSwgVHVwbGUmJiB0dXApCnsKICAgIHJldHVybiBjYWxsRnVuY3Rpb25fKGZuLCBzdGQ6OmZvcndhcmQ8VHVwbGU+KHR1cCksCiAgICAJc3RkOjptYWtlX2luZGV4X3NlcXVlbmNlPHN0ZDo6dHVwbGVfc2l6ZTxUdXBsZT57fT57fSk7Cn0KCmludCBmb28oaW50IHgsIGludCB5KSB7cmV0dXJuIHggKiB5O30KCmludCBtYWluKCkKewogICAgYXV0byBpID0gY2FsbEZ1bmN0aW9uKGZvbywgc3RkOjptYWtlX3R1cGxlKDIsIDMpKTsKICAgIHN0ZDo6Y291dCA8PCBpOwp9