传递lambda作为构造函数参数

时间:2016-03-30 21:00:16

标签: c++ lambda functional-programming c++14

我正在尝试在类中存储回调函数,因此我可以使用不同的回调创建不同的实例。不幸的是,stackoverflow迫使我写更多无用的东西,说我的帖子主要是代码。但是,通过查看下面的代码,我没有看到任何麻烦立即理解我的问题。

无法理解为什么这不起作用:

#include <iostream>
#include <functional>

class A {
    public:
        A(std::function<void()> lambda) : lambda_{lambda} {};
        void Run() { lambda_(); };
    private:
        std::function<void()> lambda_;
};

auto main() -> int {
    auto q = []{};    
    A(q) a;                                                                                                                                                                                                        
    a.Run();
}

错误:

1.cpp:15:10: error: expected ‘;’ before ‘a’
     A(q) a;
          ^

虽然这样做:

#include <iostream>
#include <functional>

void A(std::function<void()> lambda) {
    lambda(); 
};

auto main() -> int {
    auto q = []{};

    A(q);
}

2 个答案:

答案 0 :(得分:4)

在变量声明中传递构造函数参数的语法是:

A a(q);

更一般地说,声明变量的不同方式是:

TypeName variableName;    // no arguments
TypeName variableName();  // WRONG: this is a function declaration
TypeName variableName(arg1, arg2, ...);

使用C ++ 11 uniform initialization

TypeName variableName{};  // no arguments
TypeName variableName{arg1, arg2, ...};

答案 1 :(得分:2)

使用参数a初始化对象q的正确语法是

A a(q);

A(q) a;