多级crtp如何将中级类型传递到上一级

时间:2017-01-09 14:27:02

标签: c++ templates crtp

// 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时,中间节点的两种方法中哪一种是正确的? (如果没有“更好”,这是常用/有更多的优势?)。

1 个答案:

答案 0 :(得分: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>> {};

你现在可以同时使用它们,但它增加了代码的复杂性和很多耦合。