C++ 2003 §17.4.3.1/1: "Bir program, herhangi bir standart kitaplık şablonu için şablon uzmanlıklarını ad alanına yazabilir. Standart bir kitaplık şablonunun böyle bir uzmanlığı (tam veya kısmi), bildirimin, kullanıcı tanımlı bir dış bağlantı adıyla ilgili olmadığı sürece ve tanımlanmadıkça, tanımlanmamış bir davranışla sonuçlanır. uzmanlık, orijinal şablon için standart kitaplık gereksinimlerini karşılar. " Bu itibarla
, bir kütüphane şablonu uzmanlaşmak izin konum,
ve sürece bir kullanıcı tanımlı türüne bağlıdır ve özgün şablonun şartlara uyması kaydıyla ad
std
da ihtisas koydu.
Düzenlenen sorunuzdaki kod, (muhtemelen) harici bağlantıya sahip olan, kullanıcı tanımlı bir ad için bir uzmanlık gibi görünüyor, bu nedenle, bu şeylerle ilgili herhangi bir sorun yaşamamasınız.senin uzmanlık orijinal şablona gereksinimlerini karşılamak sadece gereksinimi bırakır
. Senin tipin için, bunun büyük bir kısmı muhtemelen önemsiz olacak. Açıkça görülemeyen tek bölüm, sadece numeric_limits::max()
değil, tüm şablon için bir uzmanlık sağlamak zorunda olduğunuzu gösteriyor. Bunlardan
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;
};
}
epeyce FP türleri için gerçekten vardır ve gerekli değildir: Yani, siz (örneğin 128 bitlik işaretsiz tamsayı türü için ballpark olmalıdır) gibi bir şey yapmak gerekecek bir tamsayı türü için anlamlı olmak; Hala uygulanmaları gerektiğine inanıyorum. Bir alternatif olarak
, standart birinden devralan yeni bir şablon gelemedi? – Cogwheel
§17.4.3.1/1 uyarınca: "Bir program, standart kitaplık şablonu için şablon alanı şablonunu ad alanına yazabilir. Standart kitaplık şablonunun böyle bir uzmanlığı (tam veya kısmi), bildirimin kullanıcıya bağlı olmadığı sürece tanımsız davranışla sonuçlanır. dış bağlantıların tanımlanmış adı ve uzmanlık, orijinal şablon için standart kitaplık gereksinimlerini karşılamaması durumunda. " Yani kısıtlamalar varken, * doğru şartlar altında '' std :: 'için bu tür uzmanlıkları ekleyebilirsin. –
@jerry tabut Ben bir şey ekledi tanımsız bir davranışla sonuçlanacağını düşündüm! Bu gereksinimleri nasıl karşıladığını açıklayan bir cevap verebilir misiniz? – AraK