Шаблон обертки для шаблонных функций

Я реализую шаблон для оболочки, как в:

Оболочка, взятая по ссылкам выше:

template<typename Fn, Fn fn, typename... Args>
typename std::result_of<Fn(Args...)>::type
wrapper(Args&&... args) {
return fn(std::forward<Args>(args)...);
}
#define WRAPPER(FUNC) wrapper<decltype(&FUNC), &FUNC>

Даны две функции foo и foo2:

int foo (int a) {return a};

template <class T>
T foo2(T a)
{
return a;
}

WRAPPER(foo)(4) /*Works*/
WRAPPER(foo2)(4) /*Doesn't work*/

Я понимаю, что это потому, что decltype(&FUNC) не может быть определено, если функции шаблона не даны типы аргументов. Дело в том, что информация там есть во время компиляции, т.е. foo2 вызывается с int, поэтому имеет тип int (int) и т. д. и т. д. Разве нет способа выразить вещи так, чтобы тип функции определялся типом аргументов?

упрощение

Я удалил вызов шаблона в приведенном выше коде, чтобы изолировать часть оболочки и, таким образом, получить доступ к функции и ее аргументам на одном и том же «уровне»:

template<class F, typename... Args>
typename std::result_of<F(Args...)>::type wrapper2(F&& fn, Args&&... args)
{
return fn(std::forward<Args>(args)...);
}
wrapper2(foo, 4) /*works*/
wrapper2(foo2, 4) /* the instance of foo2 to create cannot be determined */

В идеале оболочка должна быть в состоянии создать правильный экземпляр foo2 приведены типы списка аргументов.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]