Создание таблицы функторов

Рейтинг: 0Ответов: 1Опубликовано: 19.03.2023

Мне необходимо создать таблицу std::map<std::string, std::unique_ptr<AbstractFunctor> >функторов, где каждый функтор может принимать различное количество аргументов. Написав такой код


struct AbstractFunctor
{
virtual operator() () = 0
virtual ~AbstractFunctor() {} 
} 



struct func1: AbstractFunctor

{

double operator() (const double& val) override;

~func1() {} 

} 

struct func2: AbstractFunctor

{

int operator() (const double& val1, const double& val2) override;

~func2() {} 

} 

Я понял, что это не будет работать, тк мы переопределяем как будто бы не ту функцию. Как можно было бы сделать так, чтобы моя идея сработала?

Сначала подумал, что можно создать

virtual double operator() (const double&) =0;

Но быстро отдернул себя от этой мысли, тк в каждом наследнике нужно будет переопределить этот метод Может быть есть способ перегрузить переопределенный метод?

Ответы

▲ 1

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