Использование и злоупотребление std :: vatingC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование и злоупотребление std :: vating

Сообщение Anonymous »

В последнее время я был заядлым пользователем шаблона посетителей реализации в своем коде. Я привык к классическому способу реализации, но, поскольку у нас есть функциональность VARIANT :: Вариант от C ++ 17. Я склонен использовать STD :: посещение вместе с вариантом inorder для реализации шаблона посетителей. Однако есть ограничения, которые я обнаружил, используя функциональность std :: посещения. из списка типов вариантов. Однако мое наблюдение состоит в том, что когда я внедряю класс с иерархией, и родительский класс реализует перегрузки оператора (), а объект для детей вызывает его. Оно работает!. Однако, если я реализую дополнительные перегрузки Operator () в детском классе, что не имеет отношения к типам вариантов. Код ломает и бросает ошибку, сообщающую 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 "";}
};

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 :: view использует функцию лямбда или структуру/класс с иерархией, реализующей уникальные перегрузки Operator ().
Но давайте попробуем оскорблять посещение 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»