#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;
}
}