При написании пользовательских типов типов я часто выводил их из стандартных типов типов библиотеки следующим образом:
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?