初始化项列表中std::bind初始化的std::函数

std::function from std::bind initialization in the initializer list

本文关键字:初始化 std 函数 bind 列表      更新时间:2023-10-16

我有一张针对特定选择的行动图,

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,因为我无法转换到较新的标准。

问题是选项中操作成员变量的类型为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;
}

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