【发布时间】:2013-05-03 16:41:57
【问题描述】:
我需要像这样表示一个层次结构:
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
问题是,我不知道如何进行这项工作。上面的代码显然不能按预期工作并且不能编译。有没有办法让它发挥作用,或者除了我已经提到的那个之外,你有什么替代方案的建议吗?
【问题讨论】:
-
你想达到什么目的?
std::enable_if不会触发 SFINAE,而是一个硬错误。和static_assert(std::is_base_of<Y,Derived>::value)差别不大 -
我不是在这里尝试使用 SFINAE,它应该会触发一个硬错误。
-
那如果写成
static_assert会更清楚:) 从编译器的角度来看效果是一样的,但是对其他维护者来说更清楚。 -
啊,好的。我会确保改用它 - 它肯定看起来更好。
-
顺便说一句,在上面的实现中,嵌套类型将始终为
void,您忘记添加Derived作为enable_if的第二个参数(这是拆分为static_assert和一个更简单的typedef/using声明,它们的编写和阅读都更简单。
标签: c++ templates inheritance template-meta-programming crtp