определить тип вектора, используя строку во время выполнения - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь установить тип вектора или кортежа, используя строку во время выполнения.Я могу использовать если еще, но задаюсь вопросом, есть ли лучшие варианты

string typestr;
cin>>typeStr
if(typeStr=="int")
        vector<int> sample;
else if(typeStr=="double")
        vector<double> sample;
...

Например, что-то вроде этого было бы здорово (объяснение того, почему это сложно, также приветствуется)

vector<auto> sample;
sample.push_back(5); // deduces to int

или что-то вроде

vector<typeStr> sample; //typestr using cin or some other run time component

1 Ответ

0 голосов
/ 24 декабря 2018

Это не сработает, вам нужен полиморфизм подтипа , но шаблоны предоставляют своего рода параметрический полиморфизм , который не соответствует вашей цели, std::vector<T> и std::vector<U> с T != U два совершенно разных типа.

Вы можете иметь полиморфный тип данных, например:

union DataType 
{
  int i;
  double d;
};

std::vector<DataType> values;

или со сложным типом данных с виртуальными методами, но это может снизить производительность,Или вы можете переместить аргумент шаблона на более высокий уровень, например:

template<typename T> 
void process()
{
   std::vector<T> sample;
   sample.push_back(whatever);
   /* process */
}

В противном случае лучше всего обернуть std::vector<T> в другой тип, который может обеспечить необходимый вам полиморфизм.

Хотелось бы узнать, в чем именно ваша проблема, поскольку это может быть проблема XY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...