Моя виртуальная функция может возвращать либо один T
, либо std::vector<T>
. Стоит ли возвращать boost::variant<T, std::vector<T>>
в этом случае или лучше всегда возвращать std::vector<T>
? Что выглядит лучше и имеет наименьшие потери производительности? Быстрее ли использовать вариант, когда возвращается одно значение?
Должен ли я использовать boost:: variant?
Ответы (1)
Помимо проблем с производительностью, это зависит от семантики вашей функции или, точнее, от возвращаемого значения.
Вам часто нужно различать (с точки зрения пути кода) случай, когда возвращается только один T
, и случай с несколькими значениями? Или простой for(auto t : create_T_orTs()) { ... }
может сделать правильную вещь в любом случае?
Я интуитивно чувствую, что первое менее вероятно, чем второе, и, поскольку variant<>
имеет синтаксическую «цену», я бы выбрал KISS и использовал std::vector<T>
, если только нет веской семантической причины для этого. различать случаи с одним и несколькими значениями.
person
Fabio Fracassi
schedule
08.07.2013
vector<T>
илиvariant<T, vector<T>>
, я думаю, что невозможно дать ответ, не зная семантики вашей функции. - person Andy Prowl   schedule 08.07.2013std::vector
, в обоих случаях вам нужно будет проверить, есть ли у вас один элементT
(size() == 1
) или много. - person alfC   schedule 08.07.2013variant
, то это будет проблемой. (Я не говорю, что вариант решения не является более элегантным в долгосрочной перспективе, просто даю практическую рекомендацию) - person alfC   schedule 08.07.2013T
, либоstd::vector<T>
) зависит от реализации виртуальной функции, а не от какого-либо условия внутри самой функции. Так что это часть интерфейса, поэтому я подумал оboost::variant
как о решении. - person lizarisk   schedule 08.07.2013boost::static_visitor
работает во время компиляции, поэтому здесь нет накладных расходов и виртуальных функций. - person lizarisk   schedule 08.07.2013std::vector
кажется пустой тратой времени, потому что все нужно повторять позже. Так что это может быть семантическим примером (если только лизариск не даст другой). (lizarisk, пожалуйста, опубликуйте пример.) - person alfC   schedule 08.07.2013