我有一张特定选择时要采取的行动地图,
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,因为我无法转向更新的标准。
答案 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;
}
另一种解决方案是使用模板。