Проблема в том, что шаблонная функция не может быть virtual
.
Лучшая альтернатива, которая приходит мне в голову, - это создание шаблонной структуры oFoo
со специализацией для переопределения (или нет) foo()
в соответствии с логическим значением шаблона
template <bool>
struct oFoo : virtual public A
{ void foo () override { std::cout << "B::foo()" << std::endl; } };
template <>
struct oFoo<false>
{ };
затем шаблон структуры oBar
для того же самого для bar()
template <bool>
struct oBar : virtual public A
{ void bar () override { std::cout << "B::bar()" << std::endl; } };
template <>
struct oBar<false>
{ };
чтобы вы могли написать B
просто следующим образом
template <bool FOO, bool BAR>
struct B : virtual public A, public oFoo<FOO>, public oBar<BAR>
{ };
Соблюдайте наследование virtual
, чтобы избежать проблемы с алмазом.
Ниже приведен полный пример компиляции
#include <iostream>
#include <type_traits>
struct A
{
virtual void foo() { std::cout << "A::foo()" << std::endl; }
virtual void bar() { std::cout << "A::bar()" << std::endl; }
void print() { foo(); bar(); }
};
template <bool>
struct oFoo : virtual public A
{ void foo () override { std::cout << "B::foo()" << std::endl; } };
template <>
struct oFoo<false>
{ };
template <bool>
struct oBar : virtual public A
{ void bar () override { std::cout << "B::bar()" << std::endl; } };
template <>
struct oBar<false>
{ };
template <bool FOO, bool BAR>
struct B : virtual public A, public oFoo<FOO>, public oBar<BAR>
{ };
int main ()
{
A *a = new B<true, false>();
a->print();
}