有没有办法强制派生类型在C ++中定义static constexpr
?我有一个基类,我想强制每个派生类定义一个static const bool has_property
。
我尝试使用CRTP(这样每个派生类都有自己的static const
):
template <typename T, class MyClass>
struct Base {
T data;
static constexpr bool has_property;
};
template <typename T>
struct Derived : public Base<T, Derived<T> > {
static constexpr bool has_property = false;
};
但编译器抱怨Base::has_property
未初始化。
我该如何做到这一点?
答案 0 :(得分:4)
我们可以在static_assert
的构造函数中插入Base
:
template <typename T, class MyClass>
struct Base {
T data;
Base() {
static_assert(std::is_same<
typename std::decay<
decltype(MyClass::has_property)
>::type, bool
>::value,
"Must be a bool");
static_assert(MyClass::has_property || true,
"Must be constexpr");
}
};
此检查仅在实例化派生类时使用,和使用Base
的默认构造函数。 constexpr
检查目前在g ++ 4.7中不起作用。
或者,您可以使用类型特征而不是constexpr
静态成员,例如
template <typename T>
struct has_property;
template <typename T>
struct has_property<Derived<T>> : std::true_type {};
// use as: has_property<X>::value.
答案 1 :(得分:2)
将基本模板参数添加到has_property值可能会对您有用:
template <typename T, class MyClass, bool hasPropertyValue>
struct Base {
T data;
static constexpr bool has_property = hasPropertyValue;
};
template <typename T>
struct Derived : public Base<T, Derived<T>, false > {
};
[UPDATE1] 对于数组 - 而不是传递单个bool值 - 传递包含值的结构:
template <typename T, class MyClass, class MyClassPropertyValues>
struct Base {
T data;
static constexpr bool has_property[MyClassPropertyValues::length];
};
template <typename T, class MyClass, class MyClassPropertyValues>
constexpr bool Base<T, MyClass, MyClassPropertyValues>::
has_property[MyClassPropertyValues::length] = MyClassPropertyValues::initValues;
struct DerivedPropertyValues {
static constexpr size_t length = 3;
static constexpr bool initValues[length];
};
constexpr bool DerivedPropertyValues::initValues[length] = { true, false, true };
template <typename T>
struct Derived : public Base<T, Derived<T>, DerivedPropertyValues > {
};