繁体   English   中英

为什么编译器无法从诸如模板之类的模板推导类型 <typename R(typename… Args)> ?

[英]Why can't compiler deduce types from templates like template<typename R(typename… Args)>?

对我来说,编译器可以推论出这样的模板类型看起来很自然:

template<typename R(typename... Args)>
struct wrap {
    std::function<R(Args)> func_;

    template<typename... Args2>
    wrap(Args2&& ...args2) : func_(std::forward<Args2>(args2)...) {
    }

    R operator()(Args&&... args) {
        cout << "Extra stuff that wrap template does" << endl;
        return func_(std::forward<Args>(args)...);
    }
}

因此,我可以使用任何函数实例化,而无需将其签名显式赋予模板:

wrap w([](int x){ return 2*x });

并轻松调用它:

w(3);

但是事实证明,这种包装根本不起作用。 GCC 4.8.1 expected nested-name-specifier before 'R'表示expected nested-name-specifier before 'R'

为什么这不可能呢? 实现这种通用包装功能的方式是什么?

有建议在C ++ 1y中做类似的事情,我目前还不了解其状态。

您的语法不适合这些建议,因为lambda是错误的类型,无法实例化std::function模板。 它需要签名,而不是某些lambda的类型。

编写make_wrap是可能的,但是需要采用lambda类型并提取args并自己返回值。 这也不是一个好主意,因为如果您知道std::function类型的唯一方法是从推论中得出,那么在这种情况下为什么要擦除它? 相反,请携带原始的lambda类型。

有这样做的理由,但很少有好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM