C ++ 2003, §17.4.3.1 / 1: «Программа может добавить специализации шаблона для любого стандартного шаблона библиотеки в пространство имен std. Такая специализация (полная или частичная) стандартного шаблона библиотеки приводит к неопределенному поведению, если только объявление не зависит на определяемом пользователем имени внешней ссылки и если специализация не соответствует требованиям стандартной библиотеки для исходного шаблона. "
Таким образом, вам разрешено специализировать библиотечный шаблон, и помещают вашу специализацию в пространство имен std
, если это зависит от определенного пользователем типа и соответствует требованиям исходного шаблона. .
Код, который вы имеете в отредактированном вопросе, кажется, является специализацией для определенного пользователем имени, которое (предположительно) имеет внешнюю связь, поэтому у вас не должно быть никаких проблем с этой частью вещей.
Это оставляет только требование, чтобы ваша специализация соответствовала требованиям исходного шаблона. Для вашего типа, большая часть этого, вероятно, будет граничить с тривиальным. Единственная часть, которую я вижу, которая может быть неочевидной, - это то, что вам, похоже, приходится предоставлять специализацию для всего шаблона, а не только numeric_limits::max()
. То есть, вам нужно сделать что-то вроде (пример должен быть в приблизительном для 128-битного целого типа без знака):
namespace std {
template <>
class numeric_limits<my_integer> {
public:
static const bool is_specialized = true;
static T min() throw() { return 0;
static T max() throw() { return /* 2^128-1 */; } // ***
static const int digits = 128;
static const int digits10 = 38;
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
static const int radix = 2;
static T epsilon() throw() { return 0; }
static T round_error() throw() { return 0; }
static const int min_exponent = 0;
static const int min_exponent10 = 0;
static const int max_exponent = 0;
static const int max_exponent10 = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const float_denorm_style has_denorm = denorm_absent;
static const bool has_denorm_loss = false;
static T infinity() throw() { return 0; }
static T quiet_NaN() throw() { return 0; }
static T signaling_NaN() throw() { return 0; }
static T denorm_min() throw() { return 0; }
static const bool is_iec559 = false;
static const bool is_bounded = true;
static const bool is_modulo = true;
static const bool traps = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
}
Многие из них действительно относятся к типам FP и не обязательно должны быть значимыми для целочисленного типа; Я считаю, что они все еще должны быть реализованы.