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

multi level crtp how to pass a middle level type to an upper level

// 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时,中级节点的两种方法中哪一种是正确的? (如果没有"better",哪个常用/更有优势?)。

没有真正的最佳答案。你必须使用最适合你的东西。我有一些代码,其中我使用了解决方案 1,而其他咖啡则使用了解决方案 2。使用最适合您的情况。

发送的越少越好,因为类型越简单。使用 CRTP 很容易导致耦合失控。

解决方案 1 是最通用的解决方案,因为它不会强制 struct B 成为中间级别,并且可以在不更改基数的情况下成为最派生的 class。

另一方面,解决方案2是最简单的。如果 class A 是 public API 的一部分,它可能是一个不错的选择。

还有第三个解决方案对我来说非常方便值得一提:

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

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

您现在可以同时使用两者,但这会增加代码的复杂性和耦合度。