Что я должен использовать вместо void как один из альтернативных типов в варианте?
Я хочу иметь вариант, который может содержать тип Foo, (непересекающийся) тип Bar или ничего. Ну, естественно, я думал об использовании std::variant<Foo, Bar, void>
- но это не похоже на работу. То есть вы можете определить этот тип, но если вы попытаетесь создать его, у вас ничего не получится (GCC 8.2).
Так что я использую вместо этого? Какая-то пустая структура?
1 ответ
То, что вы действительно хотите, это тип среди альтернатив, который имеет единственное возможное значение - не void
, который не имеет возможных значений (и проблематичен в других отношениях). Другими словами: тип юнита вместо нижнего.
Стандартная библиотека определила, как часть <variant>
тип устройства для этого варианта использования: std::monostate
(и да, это по сути пустая структура). Используй это.
Пример:
#include <variant>
using Foo = int;
using Bar = double;
int main() {
std::variant<std::monostate, Foo, Bar> v;
v = Foo{};
}
Обратите внимание, что, в отличие от вопроса, тип с одним возможным значением является первой альтернативой; это позволяет варианту быть конструируемым по умолчанию, даже если Foo
нет. Кроме того, потенциально дешевле / быстрее построить вариант таким образом, чем Foo
, даже если он является конструируемым по умолчанию.