У меня есть определение объекта функции:
struct BaseFunctor
{
std::string desc = "Not this one!";
virtual double operator()(double a, double (*func) (double)) = 0;
};
и набор определений производных объектов функции:
struct DerivedFunctor1 : public BaseFunctor
{
std::string desc = "Yes this!";
virtual double operator()(double a, double (*func) (double))
{
return a * func(a);
}
};
struct DerivedFunctor2 : public BaseFunctor
{
std::string desc = "This is also correct!";
virtual double operator()(double a, double (*func) (double))
{
return 5 * a * func(a);
}
};
Они создаются и используются следующим образом:
double f1(double x){
return x*x+x;
}
template <typename T, typename F>
void do_something(T &func, F &derived)
{
double a = 1.0;
double res = derived(a, func);
std::cout << derived.desc << std::endl;
std::cout << "Result is: " << res << std::endl;
}
int main()
{
std::vector<BaseFunctor*> functors;
DerivedFunctor1 *derived1 = new DerivedFunctor1;
DerivedFunctor2 *derived2 = new DerivedFunctor2;
functors.push_back(derived1);
functors.push_back(derived2);
for (auto &f : functors)
{
do_something(f1, *f);
}
}
Теперь причина, по которой два функциональных объекта были получены из BaseFunctor, заключалась в том, что я мог собрать их в стандартный контейнер и перебрать их. Существуют ли другие и более эффективные способы итерации по функциональным объектам?
Во-вторых, выполнение кода выводит
Not this one!
Result is: 2
Not this one!
Result is: 10
Когда я пытаюсь получить доступ к переменной-члену desc
, я получаю член переменная родительского класса. Я мог бы написать геттеры и таким образом получить доступ к переменным-членам производных объектов-функций, но это кажется большой работой, если в объектах-функциях много переменных-членов. Есть ли другой способ добиться этого?