Доступ к членам класса с использованием reference_wrapper вместо стандартных указателей в C ++ 11 - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь построить переменные от 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 Ответ

0 голосов
/ 05 ноября 2018

vector["MamCellsF"] возвращает ссылку на значение на карте. Так что если его нет, он должен быть построен первым. При этом используется конструктор по умолчанию, но std::reference_wrapper не является конструируемым по умолчанию, поэтому возникает ошибка.

Я думаю, что контейнеры STL безопасны с T, которые не являются конструируемыми по умолчанию, но их операции могут быть ограничены. Поэтому я не рекомендую это.

...