Я реализую шаблон для оболочки, как в:
Оболочка, взятая по ссылкам выше:
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
приведены типы списка аргументов.
Задача ещё не решена.
Других решений пока нет …