У меня есть абстрактный класс , который является базовым для других классов, скажем B и C.Создайте метод override в базовом классе, если вы не знаете аргументы, переданные в функции переопределения?
Классы B и C должны иметь handle_input
метод void
типа, но число аргументов и типы могут варьироваться в зависимости от B до C.
У меня также есть функция, которая принимает указатель к в качестве аргумента - полиморфно говоря, это может быть либо , B или C - и вызывает метод handle_input
.
Проблема возникает при определении A::handle_input
, так как аргументы, передаваемые B::handle_input
могут отличаться от тех, которые прошли в C::handle_input
.
, что светодиоды мне создать в классе А что-то вроде:
/* base class */
class A {
template <class... FUNCTION_ARGS>
virtual void handle_input(FUNCTION_ARGS&&...) = 0;
};
Но ошибки происходят, потому шаблон вычисляется во время компиляции, в то время как виртуальный используется во время выполнения.
Я также сделал
class A {
template <class... FUNCTION_ARGS>
using input_handler = function<void(FUNCTION_ARGS&&...)>;
template <class... FUNCTION_ARGS>
input_handler<FUNCTION_ARGS...> handle_input;
};
Но результат более или менее такой же, как и ожидалось.
Я предполагаю, что мой вопрос будет «Как вы можете создать переопределен метод в базовом классе, когда вы не знаете, аргументы, передаваемые потенциально нескольких первостепенных функций?»
Notes (поправьте меня, если я ошибаюсь):
handle_input
динамически полиморфный, поэтому он должен быть виртуальными.- Номер аргумента
handle_input
неизвестен, поэтому необходимо использовать пакеты параметров.
A) вы не можете иметь виртуальные функции шаблона. B) типы в сигнатуре виртуальной функции должны быть одинаковыми или ковариантами, и их должно быть одинаковое число. – NathanOliver
Я предполагаю, что вы можете сделать базовый класс ввода, а затем сгруппировать входы в B и входы в C в 2 разных класса, которые вытекают из этого базового класса ввода. Таким образом, виртуальная функция класса А может объявить, что она принимает указатель на базовый тип ввода. Затем вам нужно будет выполнить динамическое преобразование внутри B и C, чтобы получить соответствующий класс ввода, который, вероятно, будет иметь разные функции getter, которые не объявлены в базовом классе ввода (учитывая, что это не является общим для двух типов ввода) ... не говорю, что это чисто, но если вам нужно это сделать ... – RyanP