шаблоны — метод связывания дочерних классов с родительскими классами с использованием переполнения стека

Есть ли способ связать вызовы суперкласса из подкласса без приведения, переопределения метода или использования интерфейсов. Например. когда делаешь

class A {
public:
A& foo() { return *this; }
};

class B : public A {
public:
B& bar() { return *this; }
};

int main(void) {
B b;
b.foo().bar();
return 0;
}

При компиляции с clang я получаю ошибку

main.cpp:13:10: error: no member named 'bar' in 'A'
b.foo().bar();
~~~~~~~ ^
1 error generated.

Что я могу понять почему (поскольку A возвращает ссылку на себя), но я бы хотел, чтобы он возвращал свой подкласс типа B, поскольку он вызывается в этом контексте. Это возможно? Или мне нужно определить B как

class B : public A {
public:
B& bar() { return *this; }
B& foo() { A::foo(); return *this; }
};

и сделать foo () виртуальным?

2

Решение

Ты можешь использовать CRTP шаблон:

template<class Derived>
class A {
public:
Derived& foo() { return *static_cast<Derived*>(this); }
};

class B : public A<B> {
public:
B& bar() { return *this; }
};

int main(void) {
B b;
b.foo().bar();
return 0;
}
6

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

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

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