Сравнение экземпляров std::variant type

#c

#c

Вопрос:

Вот мой код:

 struct A{};
struct B{};
typedef std::variant<A, B> Record;

Record Get() {
    return Record {A()};
}

void Test() {
    if (Get() == Record{A()}) {

    }
}
  

Я получаю сообщение об ошибке:

При создании экземпляра специализации шаблона функции ‘std::__1::operator==<A, B>’ нет соответствующей функции для вызова объекта типа ‘std::__1::equal_to’

Почему у меня ошибка и как я могу сравнить результат функции с Record{A()} ?

Комментарии:

1. Что именно вы пытаетесь проверить? Вы хотите знать, какой тип содержит возвращаемый вариант?

2. @cigien Это минимальный пример для воспроизведения моей ошибки. Я пишу модульный тест для тестирования моей функции Get , которая возвращает разные варианты Record .

3. Я не думаю, что вы сможете это сделать, если не сможете сделать if (A() == A()) правильно?

4. Это случайно не то, что вы ищете?

Ответ №1:

Вам необходимо предоставить операторы равенства для каждого типа std::variant , который может содержать.

 bool operator == (A const amp;lhs, A const amp;rhs) {
    return true;
}

bool operator == (B const amp;lhs, B const amp;rhs) {
    return true;
}
  

Полный пример: https://gcc.godbolt.org/z/rjTfqE

Ответ №2:

Что именно вы пытаетесь сделать? Из этого кода похоже, что вы пытаетесь просто посмотреть, содержит ли вариант, возвращаемый из Get() A . В этом случае вам понадобится std::holds_alternative вот так.

 
#include <variant>

struct A{};
struct B{};

using Record = std::variant<A, B>;

Record Get() {
    return Record {A()};
}

void Test() {
    if(std::holds_alternative<A>(Get())) 
    {
        int i = 0;
    }
}