Я хочу иметь вариант, который может содержать тип Foo, (непересекающийся) тип Bar или ничего. Ну, естественно, я думал об использовании std::variant<Foo, Bar, void>
— но это не похоже на работу. То есть вы можете определить этот тип, но если вы попытаетесь создать его, у вас ничего не получится (GCC 8.2).
Так что я использую вместо этого? Какая-то пустая структура?
То, что вы действительно хотите, это тип среди альтернатив, который имеет не замужем возможное значение — нет 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
, даже если он является конструируемым по умолчанию.
Других решений пока нет …