Bir Standart kütüphane arayan veya kayıpsız başka ilkel tip bir numara döküm ve bir şekilde dökme kayıpsız olup olmadığını bana bilgi (ya da değilse bir istisna) olabilir işlevini Boost duyuyorum.Takviye mi yoksa Standart Kitaplık dökümün kayıpsız olup olmadığını kontrol etmenin bir yolunu sunuyor mu?
auto x = lossless_cast<double>(1u); // ok, double can represent 1
auto x = lossless_cast<int>(1.2); // fail, int can't represent 1.2
auto x = lossless_cast<int>(1E200); // fail, int can't represent 1E200
boost::numeric_cast
hedef türü sayısal aralık dışında düşmek atmalarını bulacaktır ki yakın geliyor, ama onlar kayıpsız ama içinde hedef türü ise (gözlerimi göremiyorum: İşte bazı örnekler 2. örnek).
bir SO question for the C language which provides some hand-rolled solutions to this problem yok, ama temelde aşağıdaki işlevselliği ile, bir boost
veya Standart Kütüphane çözümden sonra duyuyorum:
template <typename out, typename in>
out lossless_cast(in in_value)
{
out out_value = static_cast<out>(in_value);
if (static_cast<in>(out_value) != in_value)
throw; // some exception
return out_value;
}
bu işlevsellik var mı?
döküm sonra önce ve eşitlik için sonra karşılaştırır gerçekleştiren bir fonksiyon yazın. –
Dökme gidiş gelişsiz bir çözüm bekliyorsanız, fark ettiğinizden daha zor bir sorun olabilir. Örneğin bir float 16,777,217'yi temsil edemez. – zneak
@IgorTandetnik: iyi bir fikir değil - bazı durumlarda * tanımsız davranış * verir (örn 'lossless_cast (1E200 için); söz konusu' vaka). –