基本テンプレートのパラメータに 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] 配列の場合、単一のブール値を渡す代わりに、値を含む構造体を渡します。
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 > {
};