Что я должен использовать вместо void как один из альтернативных типов в варианте?

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

Так что я использую вместо этого? Какая-то пустая структура?

3

Решение

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

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]