Обсуждение
Согласно стандартному §20.10.2/1 Header <type_traits>
synopsis [meta.type.synop]:
1
Поведение программы, которая добавляет специализации для любого из шаблонов классов, определенных в этом подпункте, не определено, если не указано иное.
Этот конкретный пункт противоречит общему представлению о том, что STL должен быть расширяемым, и не позволяет нам расширять признаки типа, как в примере ниже:
namespace std {
template< class T >
struct is_floating_point<std::complex<T>> : std::integral_constant
<
bool,
std::is_same<float, typename std::remove_cv<T>::type>::value ||
std::is_same<double, typename std::remove_cv<T>::type>::value ||
std::is_same<long double, typename std::remove_cv<T>::type>::value
> {};
}
где std::is_floating_point
расширяется для обработки числа complex
с базовым типом с плавающей запятой.
Вопросы
- По каким причинам комитет по стандартизации решил, что признаки типа не должны быть специализированными.
- Планируется ли снятие этого ограничения в будущем?
struct is_floating_point<std::complex<T>> : public std::is_floating::point<T> {};
? - person Manu343726   schedule 17.08.2014std::is_floating_point
и заставление всей единицы перевода считатьstd::complex
типом с плавающей запятой только для того, чтобы вы могли проверить, является лиstd::complex
или с плавающей запятой в одной из ваших функций, это все равно, что взорвать свой дом, чтобы получить что-то свежее. воздух внутри. Классы признаков типа запрашивают фундаментальные свойства типов и являются основными строительными блоками для шаблонных метапрограмм. Нет смысла позволять вам добавлять для них специализации. - person T.C.   schedule 17.08.2014