CRTP继承自其默认实例化

时间:2013-05-03 16:41:57

标签: c++ templates inheritance template-meta-programming crtp

我需要代表这样的层次结构:

template<typename T>
struct X
{
};

template<typename Derived = void>
struct Y : Y<void>
{
    //Note: not trying to use SFINAE here
    using DerivedType = typename std::enable_if<std::is_base_of<Y, Derived>::value, Derived>::type;
};
template<>
struct Y<void> : X<Y<void>>
{
};

struct Z : Y<Z>
{
};

Z和Y&lt; void&gt;需要是可实例化的:

W<Y<>> wy;
W<Z> wz;

所有Y&lt; T&gt;需要是Y&lt; void&gt;的实例,如果可能的话,我宁愿不要有两个不同的名称来使它工作。 (这是我的最后一招)

问题是,我不知道如何使这项工作。上面的代码显然不能按预期工作,也不能编译。有没有办法可以让它发挥作用,或者除了我已经提到的那个之外,你是否有任何替代方案的建议?

1 个答案:

答案 0 :(得分:3)

如何重新排序:

template <typename> struct Y;

template <> struct Y<void> : X<Y<void>> { };

template <typename T = void> struct Y : Y<void> { };