#include <iostream>
#include <tuple>
#include <type_traits>
#if 1 // Not in C++11 // make_index_sequence
#include <cstdint>
template <std::size_t...> struct index_sequence {};
template <std::size_t N, std::size_t... Is>
struct make_index_sequence : make_index_sequence<N - 1, N - 1, Is...> {};
template <std::size_t... Is>
struct make_index_sequence<0u, Is...> : index_sequence<Is...> {};
#endif // make_index_sequence
template <typename TReturn, typename...TArgs>
struct SomeFunction{
using ReturnType = TReturn;
using ArgTypes = std::tuple<TArgs...>;
TReturn operator () (TArgs... args) const
{
const int dummy[] = {0, ((std::cout << args),0 )...};
static_cast<void>(dummy);
}
};
template <typename TFunction, typename TupleArg = typename TFunction::ArgTypes>
class Task;
template <typename TFunction, typename... TArgs>
class Task<TFunction, std::tuple<TArgs...>>
{
public:
Task(TFunction fun, TArgs...args) : fun_(fun), args_(args...) {}
void operator()()
{
call(make_index_sequence<sizeof...(TArgs)>{});
}
private:
template <std::size_t ... Is>
void call(index_sequence<Is...>)
{
fun_(std::get<Is>(args_)...);
}
private:
TFunction fun_;
std::tuple<TArgs...> args_;
};
int main()
{
SomeFunction<void, int, char> f;
Task<SomeFunction<void, int, char>> task(f, 42, 'c');
task();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCiNpZiAxIC8vIE5vdCBpbiBDKysxMSAvLyBtYWtlX2luZGV4X3NlcXVlbmNlCiNpbmNsdWRlIDxjc3RkaW50PgoKdGVtcGxhdGUgPHN0ZDo6c2l6ZV90Li4uPiBzdHJ1Y3QgaW5kZXhfc2VxdWVuY2Uge307Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTiwgc3RkOjpzaXplX3QuLi4gSXM+CnN0cnVjdCBtYWtlX2luZGV4X3NlcXVlbmNlIDogbWFrZV9pbmRleF9zZXF1ZW5jZTxOIC0gMSwgTiAtIDEsIElzLi4uPiB7fTsKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdC4uLiBJcz4Kc3RydWN0IG1ha2VfaW5kZXhfc2VxdWVuY2U8MHUsIElzLi4uPiA6IGluZGV4X3NlcXVlbmNlPElzLi4uPiB7fTsKCiNlbmRpZiAvLyBtYWtlX2luZGV4X3NlcXVlbmNlCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVFJldHVybiwgdHlwZW5hbWUuLi5UQXJncz4Kc3RydWN0IFNvbWVGdW5jdGlvbnsKICAgIHVzaW5nIFJldHVyblR5cGUgPSBUUmV0dXJuOwogICAgdXNpbmcgQXJnVHlwZXMgPSBzdGQ6OnR1cGxlPFRBcmdzLi4uPjsKCiAgICBUUmV0dXJuIG9wZXJhdG9yICgpIChUQXJncy4uLiBhcmdzKSBjb25zdAogICAgewogICAgICAgIGNvbnN0IGludCBkdW1teVtdID0gezAsICgoc3RkOjpjb3V0IDw8IGFyZ3MpLDAgKS4uLn07CiAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZHVtbXkpOwogICAgfQp9OwoKCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVEZ1bmN0aW9uLCB0eXBlbmFtZSBUdXBsZUFyZyA9IHR5cGVuYW1lIFRGdW5jdGlvbjo6QXJnVHlwZXM+CmNsYXNzIFRhc2s7CgoKdGVtcGxhdGUgPHR5cGVuYW1lIFRGdW5jdGlvbiwgdHlwZW5hbWUuLi4gVEFyZ3M+CmNsYXNzIFRhc2s8VEZ1bmN0aW9uLCBzdGQ6OnR1cGxlPFRBcmdzLi4uPj4KewpwdWJsaWM6CiAgICBUYXNrKFRGdW5jdGlvbiBmdW4sIFRBcmdzLi4uYXJncykgOiBmdW5fKGZ1biksIGFyZ3NfKGFyZ3MuLi4pIHt9CiAgICB2b2lkIG9wZXJhdG9yKCkoKQogICAgewogICAgICAgIGNhbGwobWFrZV9pbmRleF9zZXF1ZW5jZTxzaXplb2YuLi4oVEFyZ3MpPnt9KTsKICAgIH0KcHJpdmF0ZToKICAgIHRlbXBsYXRlIDxzdGQ6OnNpemVfdCAuLi4gSXM+CiAgICB2b2lkIGNhbGwoaW5kZXhfc2VxdWVuY2U8SXMuLi4+KQogICAgewogICAgICAgIGZ1bl8oc3RkOjpnZXQ8SXM+KGFyZ3NfKS4uLik7CiAgICB9CnByaXZhdGU6CiAgICBURnVuY3Rpb24gZnVuXzsKICAgIHN0ZDo6dHVwbGU8VEFyZ3MuLi4+IGFyZ3NfOwp9OwoKaW50IG1haW4oKQp7CiAgICBTb21lRnVuY3Rpb248dm9pZCwgaW50LCBjaGFyPiBmOwogICAgVGFzazxTb21lRnVuY3Rpb248dm9pZCwgaW50LCBjaGFyPj4gdGFzayhmLCA0MiwgJ2MnKTsKCiAgICB0YXNrKCk7CgogICAgcmV0dXJuIDA7Cn0K