Посетите вариант с моностатом - PullRequest
0 голосов
/ 27 сентября 2018

У меня возникли проблемы с обертыванием варианта.

Я прочитал, что могу использовать std :: monostate для обозначения пустого состояния в качестве одной из альтернатив внутри варианта.Однако как тогда использовать шаблон посетителя, который облегчается с помощью std :: visit?

#include <variant>


struct Visitor{
  void operator()(double){};
  void operator()(int){};
};

int main() {
  std::variant<std::monostate, int, double> v = 1;

  std::visit(Visitor{}, v);
}

не работает и не обеспечивает перегрузку оператора вызова для std :: monostate.

Если я попытаюсь включить универсальную ссылочную перегрузку для оператора вызова, он просто сопоставит все и больше не будет использовать две конкретные перегрузки

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я добавил правильный метод посетителя, и он работает для меня на https://wandbox.org/ c ++ 2a

В чем была ваша проблема с ним?

#include <iostream>
#include <variant>


struct Visitor{
  void operator()(double){ std::cout << "Double!" << std::endl; };
  void operator()(int){ std::cout << "Int!" << std::endl; };

  // that was missing:
  void operator()(std::monostate){ std::cout << "Mono!" << std::endl; };
};

int main() {
  std::variant<std::monostate, int, double> v = 1;
  std::variant<std::monostate, int, double> w;

  std::visit(Visitor{}, v);
  std::visit(Visitor{}, w);
}
0 голосов
/ 27 сентября 2018

не работает и не обеспечивает перегрузку оператора вызова для std :: monostate.

Дополнительная перегрузка на std::monostate работает для меня:

struct Visitor {
   void operator()(double){}
   void operator()(int){}
   void operator()(std::monostate){}
};

При таком использовании

std::variant<std::monostate, int, double> v = 1;
std::visit(Visitor{}, v); // invokes the int overload

v= 1.234;
std::visit(Visitor{}, v); // ... and the double overload

v = std::monostate{};
std::visit(Visitor{}, v); // ... and finally the std::monostate overload

он должен успешно компилироваться и давать ожидаемое поведение.

...