// 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时,中间节点的两种方法中哪一种是正确的? (如果没有“更好”,这是常用/有更多的优势?)。
答案 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>> {};
你现在可以同时使用它们,但它增加了代码的复杂性和很多耦合。