#include <iostream>
#include <functional>
#include <string>
#include <sstream>
struct Variant
{
template<typename T>
explicit Variant(T x) { std::stringstream ss; ss << x; impl = ss.str(); }
std::string impl;
};
template<typename T>
T cast(Variant v) { std::stringstream ss(v.impl); T t; ss >> t; return t; }
namespace details
{
template<typename...T>struct Aux;
template<typename H, typename...T>
struct Aux<H, T...> : Aux<T...>
{
template<typename F, typename... A>
Aux(F f, Variant* args, A... a) : Aux<T...>(f, args + 1, a..., cast<H>(*args)) {}
};
template<>
struct Aux<>
{
template<typename F, typename... A>
Aux(F f, Variant* args, A... a) { f(a...); }
};
}
template<typename... Ts>
void invoke(std::function<void(Ts...)> f, Variant* args)
{
details::Aux<Ts...>{f, args};
}
int main()
{
std::function<void(int, double, std::string)> test = [](int a, double b, std::string c)
{
std::cout << "a=" << a << '\n';
std::cout << "b=" << b << '\n';
std::cout << "c=" << c << '\n';
};
Variant a[] = {Variant("20"), Variant("1.5"), Variant("x")};
invoke(test, a);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHNzdHJlYW0+CgpzdHJ1Y3QgVmFyaWFudAp7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgZXhwbGljaXQgVmFyaWFudChUIHgpIHsgc3RkOjpzdHJpbmdzdHJlYW0gc3M7IHNzIDw8IHg7IGltcGwgPSBzcy5zdHIoKTsgfQoKICAgIHN0ZDo6c3RyaW5nIGltcGw7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpUIGNhc3QoVmFyaWFudCB2KSB7IHN0ZDo6c3RyaW5nc3RyZWFtIHNzKHYuaW1wbCk7IFQgdDsgc3MgPj4gdDsgcmV0dXJuIHQ7IH0KCm5hbWVzcGFjZSBkZXRhaWxzCnsKICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uVD5zdHJ1Y3QgQXV4OwogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBILCB0eXBlbmFtZS4uLlQ+CiAgICBzdHJ1Y3QgQXV4PEgsIFQuLi4+IDogQXV4PFQuLi4+CiAgICB7CiAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRiwgdHlwZW5hbWUuLi4gQT4KICAgICAgICBBdXgoRiBmLCBWYXJpYW50KiBhcmdzLCBBLi4uIGEpIDogQXV4PFQuLi4+KGYsIGFyZ3MgKyAxLCBhLi4uLCBjYXN0PEg+KCphcmdzKSkge30KICAgIH07CiAgICAKICAgIHRlbXBsYXRlPD4KICAgIHN0cnVjdCBBdXg8PgogICAgewogICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lLi4uIEE+CiAgICAgICAgQXV4KEYgZiwgVmFyaWFudCogYXJncywgQS4uLiBhKSB7IGYoYS4uLik7IH0KICAgIH07Cn0KCnRlbXBsYXRlPHR5cGVuYW1lLi4uIFRzPgp2b2lkIGludm9rZShzdGQ6OmZ1bmN0aW9uPHZvaWQoVHMuLi4pPiBmLCBWYXJpYW50KiBhcmdzKQp7CiAgICBkZXRhaWxzOjpBdXg8VHMuLi4+e2YsIGFyZ3N9Owp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQsIGRvdWJsZSwgc3RkOjpzdHJpbmcpPiB0ZXN0ID0gW10oaW50IGEsIGRvdWJsZSBiLCBzdGQ6OnN0cmluZyBjKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiYT0iIDw8IGEgPDwgJ1xuJzsKICAgICAgICBzdGQ6OmNvdXQgPDwgImI9IiA8PCBiIDw8ICdcbic7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJjPSIgPDwgYyA8PCAnXG4nOwogICAgfTsKCiAgICBWYXJpYW50IGFbXSA9IHtWYXJpYW50KCIyMCIpLCBWYXJpYW50KCIxLjUiKSwgVmFyaWFudCgieCIpfTsKICAgIGludm9rZSh0ZXN0LCBhKTsKfQo=