为什么编译器不能从模板中推断类型,如模板<typename r(typename ... =“”args)=“”>?</typename>

时间:2013-10-02 10:09:48

标签: c++ templates functor

对我而言,编译器可以推断出类似这样的模板类型是很自然的:

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’

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

1 个答案:

答案 0 :(得分:1)

有人建议在C ++ 1y中做这样的事情,其状态我不是最新的。

您的语法不适合这些提案,因为lambda是用于实例化std::function模板的错误类型。它想要一个签名,而不是一些lambda的类型。

编写make_wrap是可能的,但需要采用lambda类型并提取args并自己返回值。这也很少是一个好主意,因为如果你知道std::function类型的唯一方法来自演绎,那么为什么要键入它呢?相反,携带原始的lambda类型。

有理由想要这样做,但它们很少有好处。