c++ 是否可以将对象向量中的函数绑定到std::function,或者如何通过这种方式访问对象向量中的函数

mfpqipee  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(127)

我有两个类,其中一个是“主”配置,另一个是次要配置,包含来自主配置的一些选项的子集。“主”配置成员之一是次要配置对象的向量,用于覆盖主配置选项(如果存在)。我可以绑定“主”配置获取函数的方法,我将这些方法添加到一个向量中,并在测试中用于获取这些参数(并非所有选项每次都被测试,因此我创建了一个集合值向量,它与我比较的get方法向量相匹配)。
我希望以类似的方式绑定辅助配置中的get方法,特别是最后一个向量中(应该只有)一个,但我不确定如何做到这一点,甚至不确定这是否可能。我已经尝试了一些对我有意义的调整,然而,我开始怀疑,如果这将是一个好主意,甚至与数额的卷积我正在创造。如果有人能告诉我我将如何实现这一点,要么通过绑定它,使它从向量中的第一个对象调用所需的方法,要么通过其他方式,这就是我正在寻找的。下面是一个我试图做的大量配对的向下示例。

#include <iostream>
#include <vector>
#include <functional>

using namespace std;

class secConfig{
private:
    double data;
public:
    secConfig(double);
    double get_data();
};
secConfig::secConfig(double indata){
    data = indata;
}
double secConfig::get_data(){
    return data;
}

class config{
private:
    std::vector<secConfig> secConfigs; 
    double normalData;
public:
    config(double, vector<secConfig>);
    double getData();
    vector<secConfig> getVecData();
};
config::config(double inData, vector<secConfig> inVec){
    normalData = inData;
    secConfigs = inVec;
}
double config::getData(){
    return normalData;
}
vector<secConfig> config::getVecData(){
    return secConfigs;
}

int main(int argc, char const *argv[])
{
    secConfig initial(66.6);
    vector<secConfig> inConfigs;
    inConfigs.push_back(initial);
    cout << "Inconfig raw data: " << initial.get_data() << endl;
    cout << "Inconfig vector data: " << inConfigs.back().get_data() << endl;

    config mainConfig(55.5, inConfigs);
    cout << "Main config raw data: " << mainConfig.getData() << endl;
    cout << "Main config internal vec data: " << mainConfig.getVecData().back().get_data() << endl;

    vector<function<double()>> getvals;
    getvals.push_back(bind(&config::getData, &mainConfig));
    cout << "Main config bound data: " << getvals[0]() << endl;
    // Something like: getvals.push_back(bind(&config::getVecData::back::get_data, &mainConfig));
    // So I can: cout << "Secondary (vectorized) config data : " << getvals[1]() << endl;

    return 0;
}
axr492tv

axr492tv1#

std::bind很少是实现某件事的最好或最容易的方法。
使用lambda代替。

getvals.push_back( [&]{ return mainConfig.getVecData().back().get_data(); } );

相关问题