gpt4 book ai didi

c++ - 在 C++11 中使用 reference_wrapper 而不是标准指针访问类成员

转载 作者:行者123 更新时间:2023-11-28 01:27:25 25 4
gpt4 key购买 nike

我正在尝试构建一个 unordered_map 到作为我类(class)成员的 vector 变量。我可以使用标准指针 * 来执行此操作,但这需要使用 (*x) 来访问 vector 。我想知道 std::reference_wrapper 是否会更干净,但无法让它工作。

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

class model_class {

private:

static constexpr auto MaxHerds = 1 ;
static constexpr int MaxInitValues = 5 ;
static constexpr int MaxAnimals = 2 ;

std::vector< double > MamCellsF ;
std::vector< std::vector< double > > InitCond ;

public:

std::unordered_map< std::string , std::reference_wrapper< std::vector< double > > > vector;
std::unordered_map< std::string , std::vector< std::vector< double > >* > array;

model_class ( ) :
// initialise vectors
MamCellsF( MaxHerds , 0.07 ) ,
InitCond( MaxAnimals , std::vector< double > ( MaxInitValues , 0.7 ) )
{
// point to variables from model
vector.insert({"MamCellsF", std::ref(MamCellsF)});
array["InitCond"] = &InitCond;

// assign to vectors
MamCellsF = { 0.001 , 0.002 } ; // warning: automatic resizing
InitCond = { { 1.0 , 550 , 3.5 , 1 , 4 } ,
{ 2.0 , 625 , 3.5 , 5 , 4 } } ;
}

void print_values(){

// access the vectors
double a = vector["MamCellsF"].get()[1]; // error: "no matching function call to `std::reference_wrapper<std::vector<double>>::reference_wrapper()"
double b = (*array["InitCond"])[0][1];
std::cout << a << std::endl;
std::cout << b << std::endl;

}

};

void test()
{

model_class model;
model.print_values();

}

最佳答案

vector["MamCellsF"] 返回对 map 中值的引用。因此,如果没有,则必须首先构建它。它使用默认构造函数,但 std::reference_wrapper 不是默认构造函数,因此出现错误。

我认为 STL 容器对于不可默认构造的 T 是安全的,但它们的操作可能会受到限制。所以我不建议这样做。

关于c++ - 在 C++11 中使用 reference_wrapper 而不是标准指针访问类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53161782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com