Что я должен использовать вместо 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, даже если он является конструируемым по умолчанию.

Другие вопросы по тегам