【问题标题】:Access template class parameter in default lambda argument在默认 lambda 参数中访问模板类参数
【发布时间】:2014-04-30 09:21:21
【问题描述】:

我正在编写一个简单的通用池。模板类在构造函数中接受一个参数,该参数是一个工厂函数,用于根据需要实例化池中的对象。

template<typename T>
struct Foo {
    std::function <T*()> factory_;
    Foo(std::function<T*()> factory): factory_(factory) {}
};

这编译得很好,但我想使用 lambda 为构造函数创建一个默认参数:

Foo(std::function<T*()> factory = [](){return new T();} ): factory_(factory) {}

这不会编译 - 它说 T 是未知的。有没有办法让 lambda 表达式知道类模板参数?我尝试使用typedef,但无济于事。

【问题讨论】:

标签: c++ templates c++11 lambda visual-studio-2013


【解决方案1】:

这应该可以按建议工作,但是您可能在 VC++ 中遇到了一个错误(它还没有完全准备好 C++11)。

作为一种解决方法,您可以尝试用私有静态方法替换您的 lambda。

template <typename T>
class LIFOPool
{
    std::function <T*()> factory_;
    //...details irrelevant

    static T* DefaultMake() { return new T{}; }
public:
    LIFOPool(std::function<T*()> factory = DefaultMake) : factory_(factory) {}
    //...details irrelevant
};

【讨论】:

  • 或者,我会尝试在 OP 代码中的 T 之前喷洒 typename:D
  • @Massa T 不是依赖类型...问题是,我猜,默认参数赋值的右侧是在调用上下文中评估的,并且在那个上下文T 是未知的。
  • 是的,这就是我最终做的,很遗憾。不过,在这种情况下,Lambda 会更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2016-10-06
  • 2013-02-28
  • 1970-01-01
相关资源
最近更新 更多