2017-01-09 8 views
0
// top level 
template <typename Derived> 
class A 
{ 
}; 

// approach 1 
template <typename Derived> 
class B : public A <B<Derived>> 
{ 
}; 

// approach 2 
template <typename Derived> 
class B : public A <Derived> 
{ 
}; 


// lowest level 
class C : public B <C> 
{ 
}; 

Какой один из двух подходов к узлам среднего уровня является правильным при применении CRTP? (если нет «лучшего», который обычно используется/имеет больше преимуществ?).многоуровневое crtp как передать тип среднего уровня на верхний уровень

ответ

2

На самом деле нет ответа . Вы должны использовать то, что подходит вам лучше всего. У меня есть код, в котором я использовал решение 1, и другой кофе, который использует решение 2. Используйте то, что подходит вашему делу лучше всего.

Чем меньше вы должны отправлять, тем лучше, потому что будут проще ваши типы. Сцепление может легко выйти из-под контроля с помощью CRTP.

Решение 1 является наиболее общим, поскольку оно не будет заставлять struct B быть средним уровнем и может стать самым производным без изменения базового класса.

Решение 2 с другой стороны является самым простым. Если класс A является частью общедоступного API, это может быть значительным вариантом.

Существует также третий раствор, который вышел очень удобно для меня стоит упомянуть:

template<typename Level1, typename Level2> 
struct A {}; 

template<typename Derived> 
struct B : A<Derived, B<Derived>> {}; 

Вы можете использовать как сейчас, но это усложняет код, и много сцепления.

+0

но не пересылает наиболее производные более общие? (подход 2 в этом случае). – mkmostafa

+0

@mkmostafa Я добавил объяснение обличительности и сложности. –