любопытно повторяющийся шаблон и виртуальное наследование

Я использую любопытно повторяющийся шаблон для моделирования статического полиморфизма.

Это работает абсолютно нормально, пока не представишь virtual inheritance (для решения diamond problem).

Затем компилятор (Visual Studio 2013) начинает жаловаться на

error C2635: cannot convert a 'Base*' to a 'Derived*'; conversion from a virtual base class is implied

По сути, это преобразование не положено.

Это почему? И то и другое static_cast а также c-style cast потерпеть поражение.

Есть ли решение для этого, которое не включает отказ от одного или другого?

РЕДАКТИРОВАТЬ:

Вот пример (удали виртуальный и все работает):

template <class Derived>
struct Base
{
void interface()
{
static_cast<Derived*>(this)->implementation();
}
};

struct Derived : virtual Base<Derived>
{
void implementation() { std::cout << "hello"; }
};

int main()
{
Derived d;
d.interface();
}

2

Решение

Из того, что я узнал, они не могут быть объединены.

Суть curiously recurring template pattern это разрешить вызов во время компиляции.

Как указывает Т.С. в комментариях, virtual inheritance не может быть решена до времени выполнения.

Что означает, что двое не смешиваются, а один должен дать.

2

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


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