2013-05-03 66 views
0

继承我要代表这样一个层次结构: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 <无效>需要被实例化:

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

全部▲<牛逼>需要成为Y <void>的实例,如果可能的话,我宁愿不使用两个不同的名称来使其工作。 (这是我的最后手段)

问题是,我不知道如何使这项工作。上面的代码显然不能按预期工作,也不会编译。有没有一种方法可以使其发挥作用,或者除了我已经提到的方法之外,您是否还有其他方法的建议?

+0

你到底想达到什么目的? 'std :: enable_if'不会触发SFINAE,而是一个硬错误。与'static_assert(std :: is_base_of :: value)'' – 2013-05-03 16:54:35

+0

没有太大差别我不想在这里使用SFINAE,它应该会触发一个硬错误。 – 2013-05-03 18:06:38

+0

然后,如果它被声明为'static_assert',它会更清晰:)从编译器的角度来看效果将是相同的,但对其他维护者来说更清楚。 – 2013-05-03 18:19:43

回答

3

如何重新安排它:

template <typename> struct Y; 

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

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

谢谢,这很有效!我对你的答案进行了更正,因为你继承了错误的东西并且保持默认值 – 2013-05-03 18:13:03

+0

@ LB--:哦好的,我明白了,现在我添加了这些更改。 – 2013-05-03 19:41:35