c ++: вектор пользовательского типа? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть вектор, в котором я храню данные. Я хочу, чтобы пользователи могли определять уровень точности для вектора хранения (плавающего или удваивающегося).

Как объявить векторна основе пользовательского ввода?Это, очевидно, не работает:

std::vector<userWantsFloats ? float : double> data; ...

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018
Параметр

A может использовать std::variant.

std::variant<std::vector<float>, std::vector<double>> data;

. Затем вы инициализируете вариант на основе пользовательского ввода, номожно написать любую логику только один раз, используя std::visit

std::visit([](auto&& vec) {
  // Do your thing
}, data);

Если C ++ 17 не является опцией, тогда boost имеет вариант шаблона, который вдохновил уже ставший стандартным.Вы можете использовать это вместо этого.Обратитесь к документации boost по этому вопросу.

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

Вы не можете выбрать тип, используемый в создании шаблона класса, основываясь на значении, известном только во время выполнения.

Использование

std::vector<userWantsFloats ? float : double> data;

в порядке, если значение userWantsFloats известно во время компиляции.Это не нормально, если значение userWantsFloats неизвестно только во время выполнения.

Вам придется использовать что-то вроде:

if ( userWantsFloats )
{
   std::vector<float> data;
   // Use data
}
else
{
   std::vector<double> data;
   // Use data
}

Чтобы иметь возможностьмаксимизируйте повторное использование остальной части вашего кода, это должны быть шаблоны функций и / или шаблоны классов.

template <typename T>
void myAppLogic(std::vector<T>& data)
{
   // Do the work of your application
}

if ( userWantsFloats )
{
   std::vector<float> data;
   myAppLogic(data);
}
else
{
   std::vector<double> data;
   myAppLogic(data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...