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