При написании пользовательских типов типов я часто выводил их из стандартных типов типов библиотеки следующим образом:
template<typename T>
struct some_type_trait:
std::is_arithmetic<T>
{};
Однако иногда я задаюсь вопросом, является ли наследование типа type
типа стандартного типа библиотеки более чистым:
template<typename T>
struct some_type_trait:
std::is_arithmetic<T>::type
{};
Общая идея заключается в том, что в конечном итоге имеет значение только наследование от std::bool_constant
, но факт, что мы наследуем от std::is_arithmetic
в первом примере, а не непосредственно от std::bool_constant
(как во втором случае) можно наблюдать с помощью полиморфизма или utilies типа std::is_base_of
.
Суть в том, что наследование непосредственно из bool_constant
через type
тип члена становится более чистым, потому что это именно то, что мы хотим. Однако наследование от std::is_arithmetic
немного короче и обеспечивает по сути одно и то же поведение. Итак... есть ли какое-то тонкое преимущество, которое я мог бы потерять при выборе того или другого (правильность, время компиляции...)? Существуют ли тонкие сценарии, где наследование от std::is_arithmetic
может изменить поведение приложения, по сравнению с наследованием непосредственно из базового bool_constant
?