Это попытка ответить на то, что, возможно, является моим неправильным толкованием в отношении запроса OP, поскольку простая совершенная пересылка решает описанный сценарий, не прибегая к выводу типов аргументов в виде упакованной функции.
Исходный ответ: По крайней мере для ограниченного варианта использования, такого как вы, вы можете использовать структуру черты малого типа, чтобы вывести тип одиночного аргумента , передаваемого wrapper()
из типа аргумента функтора:
#include <iostream>
#include <string>
struct a {
static void run(int cref) {
cref = 5;
};
};
struct b {
static void run(int &cref) {
cref = 5;
};
};
template <typename>
struct ArgType;
template <typename R, typename A>
struct ArgType<R(A)>
{ using type = A; };
template <class FTor>
struct foo {
static void wrapper(typename ArgType<decltype(FTor::run)>::type args) {
FTor::run(args);
}
};
int main()
{
int bar = 4;
foo<a>::wrapper(bar);
std::cout << bar;
foo<b>::wrapper(bar);
std::cout << bar;
}
Вывод:
45
Обратите внимание, что это не будет поддерживать совершенную пересылку из оболочки, как wrapper()
здесь сам по себе не является частью * контекста вывода типа - в отличие от вашего фрагмента, который выводит, но не основывается на том, что вы хотите, чтобы он выводил.Надеюсь, я найду время, чтобы добавить обобщенное решение для variadic шаблона функции, такого как в вашем фрагменте, perfect forwarding включается.