【问题标题】:passing lambda as a constructor argument将 lambda 作为构造函数参数传递
【发布时间】:2016-07-19 02:16:32
【问题描述】:

我正在尝试将回调函数存储在一个类中,这样我就可以创建具有不同回调的不同实例。不幸的是,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);
}

【问题讨论】:

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


    【解决方案1】:

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

    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, ...};
    

    【讨论】:

    • 不要忘记统一初始化:TypeName variableName{};TypeName variableName{arg1, arg2, ...};
    • 谢谢,我会补充的。
    【解决方案2】:

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

    A a(q);
    

    不是

    A(q) a;
    

    【讨论】:

      猜你喜欢
      • 2015-08-02
      • 2011-06-28
      • 2011-09-04
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多