多级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>> {};
您现在可以同时使用两者,但这会增加代码的复杂性和耦合度。
// 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>> {};
您现在可以同时使用两者,但这会增加代码的复杂性和耦合度。