-2

我有一张在某些选择上要采取的行动图,

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,因为我无法迁移到更新的标准。

4

1 回答 1

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

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

于 2017-01-20T09:57:02.887 回答