Создайте шаблон метода класса, который будет использовать функцию, реализованную позже

Возможно ли реализовать такое поведение? Он не должен использовать наследование, я просто хочу реализовать шаблон проектирования метода шаблона с передачей общих аргументов (с шаблонами c ++).

class A {
public:
template<typename ...tArgs>
void call(tArgs ...vArgs) {
for (int i = 0; i < 5; ++i)
impl(vArgs...);
}
};

class B : public A {
public:
void impl() {}
void impl(int) {}
};

int main() {
B b;
b.call();    // ok
b.call(1);   // ok
b.call("");  // compile error, no method to call inside 'call'
return 0;
}

0

Решение

Это почти классический пример Шаблон CRTP, требуется всего несколько небольших изменений:

// A is now a template taking its subclass as a parameter
template <class Subclass>
class A {
public:
template<typename ...tArgs>
void call(tArgs ...vArgs) {
for (int i = 0; i < 5; ++i)
// need to static cast to Subclass to expose impl method
static_cast<Subclass*>(this)->impl(vArgs...);
}
};

// pass B into A template (the "curiously recurring" part)
class B : public A<B> {
public:
void impl() {}
void impl(int) {}
};

int main() {
B b;
b.call();    // ok
b.call(1);   // ok
// b.call("");  // will cause compile error, no method to call inside 'call'
return 0;
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]