Помогите, пожалуйста, правильно описать абстрактный класс Block.
Есть некий абстрактный класс Block с методом virtual execute(). У этого метода есть наследники:
Каждый из эти классов должен унаследовать метод execute и переопределить его, но у каждого класса метод execute принимает разные по типу параметры и возвращает разный результат. Например, в VecSum execute принимает vector<int>, возвращает int. В VecMult принимает vector<int>, возвращает vector<int>. Описывая метод execute в абстрактном классе Block, я должен указать тип возвращаемого результата и аргументы.
Как мне правильно описать Block::execute или же реализовать методы в классах наследниках? Организовать нужно таким образом, чтобы потом можно было создать класс наследник, например, Sqrt, который смог бы переопределить метод execute и возвратить корень из числа, при этом никак не изменяя класс Block.
язык c++ vs2012 os windows
Я думаю, что в данном случае не нужен абстрактный класс. Какой с него смысл, если входные и выходные типы всегда различные?
Вызывающему классу придется как-то догадываться о типе.
В классическом чистом С это делалось указателем на void. Но в плюсах так не делают.
Но если очень сильно-сильно хочется выстрелить себе в ногу веревкой (с), то просто создайте специальный класс "аргумент" и используйте его в качестве входного и выходного. Где-то так:
class Arg{
public:
int getArgCount();
void* getArg(); // тут наверно лучше шаблоны или что то подобное
}
template<typename T>
class executor;
template<typename R, typename... A>
class executor<R(A...)>
{...}
template<typename... A>
class executor<void(A...)>
{...}
R - тип возвращаемого значения, A - список аргументов.
Задавайте частичный специализации вместо наследования, это компилтайм. :)
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости