C ++ - альтернатива вызову указателей на функции базового класса

Я нашел много постов, где было довольно четко указано, что функция производного класса не может быть назначена указателю функции базового класса. Поэтому я хочу знать, как подойти и разрешить следующую ситуацию:

Предположим, у меня есть следующая база class

class base {
protected:
    typedef void (base::*base_fp)();
    typedef std::map<std::string, base_fp> array;

    array associativeArray;    
};

Основная цель этого класса - иметь свойство associative-array из functions

Итак, я хотел, чтобы каждый производный ребенок мог добавлять свои методы в "ассоциативный массив"

this->associativeArray["Method"] = &child::method; // from the child class

Мое первоначальное намерение использовать это состояло в том, чтобы вызывать различные методы в зависимости от требования без использования условных операторов. Он был бы в блоке try-catch для обработки случая несуществующего индекса. Поскольку мой оригинальный подход не возможен, так что будет правильным способом сделать это?

РЕДАКТИРОВАТЬ: Пример использования

Предположим, что ассоциативный массив является массивом «алгоритма» functions. Затем для пользовательского «алгоритма» ввода я смогу вызвать соответствующий метод, определенный в дочернем классе

(this->*associativeArray.at("algorithm"))();
4 голоса | спросил Daolagajao 6 Mayam18 2018, 04:06:31

2 ответа


0
Самое близкое, что я могу получить к тому, что вы хотите, это использовать ---- +: = 0 =: + ---- (доступно с C ++ 11).Сначала мы изменим ваши ---- +: = 1 =: + ---- s как для целей модернизации, так и для использования ---- +: = 2 =: + ---- :Потому что ---- +: = 4 =: + ---- хранит ---- +: = 5 =: + ---- s, он будет работать со всем, что мы можем считать вызываемым.Это не может работать напрямую с функциями-членами ( ---- +: = 6 =: + ---- может помочь, но я не использовал эту библиотечную функцию), но вы можете использовать тривиальные замыкания, чтобы получить аналогичныеповедение.Вы можете использовать это, используя следующий код:
ответил Stephen Newell 6 Mayam18 2018, 04:52:26
0
Я думаю, что вам нужно, это ---- +: = 0 =: + ----, потому что безопасно использовать между двумя функциями, имеющими одинаковые подписи, даже если они происходят из одной иерархии классов.увидеть это демо
ответил Abr001am 6 Maypm18 2018, 17:00:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132