#include <functional>
#include <iostream>
template <typename...Args>
class Dispatcher {
typedef typename std::function<void(Args...)> Fn;
public:
Dispatcher(Fn f) : m_function(std::move(f)) {}
void operator()(Args...args) {
m_function(std::forward<Args>(args)...);
}
private:
Fn m_function;
};
template <typename C, size_t N, typename...Args>
struct NaryDispatch_ {
using type = typename NaryDispatch_<C, N-1, Args..., C&>::type;
};
template <typename C, typename...Args>
struct NaryDispatch_<C, 0, Args...> {
using type = Dispatcher<Args...>;
};
template <typename C, size_t N>
using NaryDispatch = typename NaryDispatch_<C, N>::type;
int main() {
NaryDispatch<const int, 3> f{[](const int& a, const int& b, const int& c){
std::cout << a << ' ' << b << ' ' << c << '\n';
}};
f(42, 13, 11);
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZS4uLkFyZ3M+CmNsYXNzIERpc3BhdGNoZXIgewogICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmZ1bmN0aW9uPHZvaWQoQXJncy4uLik+IEZuOwoKICAgIHB1YmxpYzoKICAgICAgICBEaXNwYXRjaGVyKEZuIGYpIDogbV9mdW5jdGlvbihzdGQ6Om1vdmUoZikpIHt9CgogICAgICAgIHZvaWQgb3BlcmF0b3IoKShBcmdzLi4uYXJncykgewogICAgICAgICAgbV9mdW5jdGlvbihzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwogICAgICAgIH0KCiAgICBwcml2YXRlOgogICAgICAgIEZuIG1fZnVuY3Rpb247Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgc2l6ZV90IE4sIHR5cGVuYW1lLi4uQXJncz4Kc3RydWN0IE5hcnlEaXNwYXRjaF8gewogIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBOYXJ5RGlzcGF0Y2hfPEMsIE4tMSwgQXJncy4uLiwgQyY+Ojp0eXBlOwp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUuLi5BcmdzPgpzdHJ1Y3QgTmFyeURpc3BhdGNoXzxDLCAwLCBBcmdzLi4uPiB7CiAgdXNpbmcgdHlwZSA9IERpc3BhdGNoZXI8QXJncy4uLj47Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgc2l6ZV90IE4+CnVzaW5nIE5hcnlEaXNwYXRjaCA9IHR5cGVuYW1lIE5hcnlEaXNwYXRjaF88QywgTj46OnR5cGU7CgoKaW50IG1haW4oKSB7CiAgTmFyeURpc3BhdGNoPGNvbnN0IGludCwgMz4gZntbXShjb25zdCBpbnQmIGEsIGNvbnN0IGludCYgYiwgY29uc3QgaW50JiBjKXsKICAgIHN0ZDo6Y291dCA8PCBhIDw8ICcgJyA8PCBiIDw8ICcgJyA8PCBjIDw8ICdcbic7CiAgfX07CiAgZig0MiwgMTMsIDExKTsKfQo=