Как назначить std::variant с повторяющимися типами?

Если у вас есть std::variant с повторяющимися типами, как его назначить? std::variant по-видимому, допускает дублирование типов.

std::variant<int,int> foo;

компилируется успешно, и все же я не уверен, как назначить foo, и вдвойне, если я хочу назначить конкретную запись в варианте.

Я пробовал:

std::variant<int,int> foo;
foo = 1;

не удается скомпилировать с ошибкой, что = не определено для std::variant<int,int>.

std::variant<int,int> foo;
get<foo, 0> = 1;

не удается скомпилировать с ошибкой, что для определения типа недостаточно информации о контекстном типе.

Я хочу что-то вроде

std::variant<int,int> foo;
something<foo, 1> = 10
assert(foo.index == 1);
assert(get<1>(foo) == 10);

связанное/обман: stackoverflow.com/questions/68109028/…

NathanOliver 20.08.2024 22:50
variant::emplace<I>(auto&&...args)
Gene 20.08.2024 23:01

@Джин, это было именно то, что я искал. если бы вы представили это как ответ, я бы принял это.

Algorithmic Canary 20.08.2024 23:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это переведет вариант в состояние, в котором 0-я альтернатива активна и ее значение равно 1:

foo.emplace<0>(1);

Обратите внимание, что семантика emplace в целом не идентична семантике присваивания. Оператор присваивания сначала проверяет, является ли текущая активная альтернатива той же самой, которая должна быть активной после присваивания. Если да, то он просто присваивает существующую альтернативу. Напротив, emplace всегда сначала уничтожает активную в данный момент альтернативу, а затем создает ее, даже если новая альтернатива имеет тот же индекс, что и старая. Чтобы использовать семантику присваивания, вы должны сделать что-то вроде этого:

if (auto* p = std::get_if<0>(&foo)) {
    *p = 1;
} else {
    foo.emplace<0>(1);
}

Для целых чисел это не имеет значения, но для более сложных типов присвоение иногда может быть более эффективным, чем уничтожение объекта и создание нового с нужным значением.

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