Это, возможно, основной вопрос, но я не могу сразу увидеть ответ.
Рассмотрим следующий код:
template<bool b>
struct T {
static constexpr int value = (b ? 42 : 0);
};
template<bool b>
struct U {
enum { value = (b ? 42 : 0) };
};
int main() {
static_assert(T<true>::value == 42, "!");
static_assert(T<false>::value == 0, "!");
static_assert(U<true>::value == 42, "!");
static_assert(U<false>::value == 0, "!");
}
Я использую такие структуры, как T
, но не раз я видел такие структуры, как U
, используемые для той же цели (в основном определение признаков).
Насколько я могу судить, они решаются во время компиляции, и они решают почти ту же проблему, но мне кажется, что T
гораздо читабельнее, чем U
(ну, я знаю, мой личный мнение).
Мой вопрос довольно прост: есть ли какая-либо техническая причина, по которой одно решение лучше, чем другое?
Более того, есть ли случай, для которого один из них не является жизнеспособным решением?