std :: function来自初始化列表中的std :: bind初始化

时间:2017-01-20 09:40:23

标签: c++ c++11 initializer-list stdbind reference-wrapper

我有一张特定选择时要采取的行动地图,

struct option {
  int num;
  std::string txt;
  std::function<void(void)> action;
};
void funct_with_params(int &a, int &b)
{
    a = 3; b = 4;
}
int param1 = 1;
int param2 = 3;

我想以新的初始化列表方式初始化那些的向量:

const std::vector<option> choices
{ 
    {
        1,
        "sometext",
        std::bind(&funct_with_params, std::ref(param1), std::ref(param2))
    },
}

我无法在向量中初始化函数的功能,是否有以某种方式将std::bind传递给向量的方法?

我能够通过使用lambda表达式而不是绑定来使示例工作,是否有我遗漏的东西?或者这不是使用std::bind的正确方法?

我正在使用C ++ 11,因为我无法转向更新的标准。

1 个答案:

答案 0 :(得分:3)

问题是选项中的操作成员变量类型是std::function<void(void)>,并且您正在使用不同的函数(std::function<void(int &a, int &b)>)初始化选项。这是由于std::bind正常运作(std::bind)。

您需要正确的类型。我也可能会建议,因为你想使用常量向量,最好使用std::array

代码示例:

#include <functional>
#include <vector>
#include <array>

struct option {
    int num;
    std::string txt;
    std::function<void(int &a, int &b)> action;
};

void funct_with_params(int &a, int &b){
    a = 3; b = 4;
}


int main(){
    int param1 = 1;
    int param2 = 3;

    //vector fill
    const std::vector<option> choices{
        { 1, "sometext", std::bind(funct_with_params, std::ref(param1), std::ref(param2)) }
    };

    //array fill
    const std::array<option, 1> choices2 = {
        { 1, "sometext", std::bind(funct_with_params, std::ref(param1), std::ref(param2)) }
    };
    return 0;
}

另一种解决方案是使用模板。