#define INVOKE(hof, func, arg) \
hof([](const decltype(arg)& arg_){return func(arg_);}, arg);
// This function mimics the signature of QtCollector::run for testing
template <typename Functor, typename Arg1>
auto QtConcurrent_run(Functor functor, const Arg1 &arg1)
-> decltype(functor(arg1))
{
return functor(arg1);
}
#include <iostream>
int f(int x) { std::cout << "int" << " " << x << std::endl; return x; }
double f(double x) { std::cout << "double" << " " << x << std::endl; return x; }
int main() {
INVOKE(QtConcurrent_run, f, 3);
INVOKE(QtConcurrent_run, f, 3.14);
INVOKE(QtConcurrent_run, f, '3');
return 0;
}
ICAgICNkZWZpbmUgSU5WT0tFKGhvZiwgZnVuYywgYXJnKSBcCiAgICAgICBob2YoW10oY29uc3QgZGVjbHR5cGUoYXJnKSYgYXJnXyl7cmV0dXJuIGZ1bmMoYXJnXyk7fSwgYXJnKTsKICAgCiAgICAvLyBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgc2lnbmF0dXJlIG9mIFF0Q29sbGVjdG9yOjpydW4gZm9yIHRlc3RpbmcKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yLCB0eXBlbmFtZSBBcmcxPgogICAgYXV0byBRdENvbmN1cnJlbnRfcnVuKEZ1bmN0b3IgZnVuY3RvciwgY29uc3QgQXJnMSAmYXJnMSkKICAgICAgICAgIC0+IGRlY2x0eXBlKGZ1bmN0b3IoYXJnMSkpCiAgICB7CiAgICAgICAgICByZXR1cm4gZnVuY3RvcihhcmcxKTsKICAgIH0KCiAgICAjaW5jbHVkZSA8aW9zdHJlYW0+CiAgICAKICAgIGludCBmKGludCB4KSB7IHN0ZDo6Y291dCA8PCAiaW50IiA8PCAiICIgPDwgeCA8PCBzdGQ6OmVuZGw7IHJldHVybiB4OyB9CiAgICBkb3VibGUgZihkb3VibGUgeCkgeyBzdGQ6OmNvdXQgPDwgImRvdWJsZSIgPDwgIiAiIDw8IHggPDwgc3RkOjplbmRsOyByZXR1cm4geDsgfQogICAgCiAgICBpbnQgbWFpbigpIHsKICAgICAgSU5WT0tFKFF0Q29uY3VycmVudF9ydW4sIGYsIDMpOwogICAgICBJTlZPS0UoUXRDb25jdXJyZW50X3J1biwgZiwgMy4xNCk7CiAgICAgIElOVk9LRShRdENvbmN1cnJlbnRfcnVuLCBmLCAnMycpOwogICAgICByZXR1cm4gMDsKICAgIH0K