0

我正在为包装器实现一个模板,如下所示:

从上面的链接中获取的包装是:

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给定参数列表类型的正确实例。

4

0 回答 0