Доступ к членам класса с использованием reference_wrapper вместо стандартных указателей в C++11
Я пытаюсь построить unordered_map
в vector
переменные, которые являются членами моего класса. Я могу сделать это с помощью стандартных указателей *
но это требует использования (*x)
чтобы получить доступ к вектору. Интересно, если 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();
}
1 ответ
Решение
vector["MamCellsF"]
возвращает ссылку на значение на карте. Так что если его нет, он должен быть создан первым. Это использует конструктор по умолчанию, но std::reference_wrapper
не является конструируемым по умолчанию, следовательно, ошибка.
Я думаю, что контейнеры STL безопасны с T, которые не являются конструируемыми по умолчанию, но их операции могут быть ограничены. Поэтому я не рекомендую это.