`< /p>
Код: Выделить всё
#include
#include
#include
#include
using TYPE = std::variant;
class parentVisitor {
public:
parentVisitor() = default;
std::string operator()(const int value) const {return std::to_string(value);}
std::string operator()(const double value) const {return std::to_string(value);}
std::string operator()(const float value) const {return std::to_string(value);}
std::string operator()(std::string value) const {return value;}
std::string operator()(std::monostate) const {return "";}
};
class childVisitor : public parentVisitor {
private:
TYPE m_value;
public:
// The below line creates the error!
void operator()(std::vector value) const {}
explicit childVisitor(TYPE value) : m_value(std::move(value)) {};
void printValue() {
const std::string text = std::visit(*this, m_value);
std::cout
error: static assertion failed due to requirement 'is_invocable_v': `std::visit` requires the visitor to be exhaustive.
611 | static_assert(is_invocable_v, "`std::visit` requires the visitor to be exhaustive.");
Но давайте попробуем оскорблять посещение std ::, внедрив функцию в родительском классе, которую можно было бы вызвать из детского класса, который приведет к применению шаблона посетителя. < /P>
`< /p>
#include
#include
#include
#include
using TYPE = std::variant;
class parentVisitor {
public:
parentVisitor() = default;
std::string operator()(const int value) const {return std::to_string(value);}
std::string operator()(const double value) const {return std::to_string(value);}
std::string operator()(const float value) const {return std::to_string(value);}
std::string operator()(std::string value) const {return value;}
std::string operator()(std::monostate) const {return "";}
std::string visit_parent(TYPE type) {
return std::visit(*this, type);
}
};
class childVisitor : public parentVisitor {
private:
TYPE m_value;
public:
// The below line creates the error!
void operator()(std::vector value) const {}
explicit childVisitor(TYPE value) : m_value(std::move(value)) {};
void printValue() {
//const std::string text = std::visit(*this, m_value);
std::string text = visit_parent(m_value);
std::cout
Дайте мне знать, это имеет смысл и есть ли другой способ реализации функциональности посетителей из иерархии.
Подробнее здесь: https://stackoverflow.com/questions/793 ... g-stdvisit
Мобильная версия