Что я должен использовать вместо void как один из альтернативных типов в варианте? - PullRequest
0 голосов
/ 03 ноября 2018

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

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

1 Ответ

0 голосов
/ 03 ноября 2018

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

...