У меня есть базовый класс, параметр и два производных класса: Scalar & Vector. В каждом производном классе у меня есть функция-член, которая принимает указатель функции в качестве входных данных:
В скалярном классе:
typedef double (*samplerType)(RandNum& rnState);
void RegisterSampler( samplerType input );
В классе Vector:
typedef std::vector<double> (*samplerType)(RandNum& rnState);
void RegisterSampler( samplerType input );
Обратите внимание на различные типы возврата: double
и std::vector<double>
. Я хотел бы определить эту функцию во взаимном базовом классе Parameter - поэтому я изменил функции на (void* input)
, а затем попробовал следующее при определении функций в классах Scalar & Vector:
samplerType inputSampler = dynamic_cast (входной);
Тем не менее, я получаю следующую ошибку в VS 2005:
error C2680: 'double (__cdecl *)(RandNum &)' : invalid target type for dynamic_cast
target type must be a pointer or reference to a defined class
Grumble Grumble Grumble ... Я не уверен, действительно ли это (стандартное разрешение) C ++ или нет, но я думаю, что в любом случае я буду рассматривать это как недостаток в моем дизайне.
Итак , мой стандартный подход - шаблон базового класса с типом возвращаемого значения функции, но я не могу. Базовый класс, Parameter, должен - по замыслу - быть свободным от любой информации о типах. Есть ли другой способ оформления наследования?
Мои попытки Google это практически не дали указателям на функции - следовательно, я буду верить, что это на самом деле неверный синтаксис , но, возможно, просто действительно, действительно необычная проблема дизайна? Это еще одно из тех мест, функторы на помощь?