Я бы хотел, чтобы следующий код работал без изменения классов Child1
и Child2
:
#include <iostream>
int triple(int a) {
return a * 3;
}
int add(int a, int b) {
return a + b;
}
template<int (*F)(int)>
class Parent {
public:
Parent(int a) {
std::cout << "constructed: " << F(a) << std::endl;
}
};
class Child1 : Parent<triple> {
public:
Child1(int a) : Parent(a) {}
};
/*class Child2 : Parent<add> {
public:
Child2(int a, int b) : Parent(a, b) {}
};*/
int main() {
Child1 child(4);
//Child2 child(5, 6);
return 0;
}
Как вы можете видеть, например, Child1
наследуется от Parent
, который был создан с помощью функции triple
.Таким образом, когда экземпляр Child1
создается с четырьмя, он выдает "constructed: 12
".
В отличие от этого, Child2
закомментирован, поскольку он, очевидно, еще не работает.В основной функции я пытаюсь передать два аргумента конструктору Child2
, так же как и базовая функция add()
ожидает этого.Тем не менее, конструктор Parent
принимает только один аргумент и, возможно, для решения потребуется template<typename Args...>
перед ним.Кроме того, классу Parent
потребуется аргумент шаблона, такой как int (*F)(Args...)
.В конце концов, создание экземпляра Child2
, как это делает основная функция, должно вывести «constructed: 11
».
Как я могу это сделать, то есть создать шаблонный аргумент, который является функцией, которая может иметь любое количество параметров?Опять же, обратите внимание, что код класса Parent
- единственное, что может быть изменено.