Вы не можете использовать if constexpr
для этого. Вам нужно будет объединить их в один член, используя что-то вроде std::conditional
:
std::conditional_t<(majorVer == 1) && (minorVer > 10), bool, int> newField;
Кроме того, вы можете обернуть каждое из двух типов полей в свой собственный тип:
struct A { bool newField; };
struct B { int newInt; };
И либо наследовать от std::conditional_t<???, A, B>
, либо иметь одного из них в качестве члена.
<ч />
Для случая, когда вам нужен либо член, либо ничего, другой случай просто должен быть пустым типом. В C ++ 20 это:
struct E { };
[[no_unique_address]] std::conditional_t<some_condition(), bool, E> newField;
В C ++ 17 и более ранних версиях вы захотите унаследовать это, чтобы гарантировать, что оптимизация пустых баз включится:
struct B { bool field; };
struct E { };
template <unsigned majorVer, unsigned minorVer>
class Object : private std::conditional_t<some_condition(), B, E>
{ ... };