我們過度使用模板,並且我們不能始終告訴手頭類型的簽名,所以我們需要技巧來隱藏最終會優化的警告。我有一個簡單的ASSERT(condition)
宏,如果條件不是真的,它會拋出一些東西。C++:從T到無符號T的轉換
目標是檢查T
鍵入的值範圍count
值。我們需要它至少爲零,最多不超過size_t
。
template<typename SomeIntegral>
SomeIntegral ZERO()
{
return SomeIntegral(0);
}
template<typename T>
class C
{
public:
void f(T count)
{
std::vector<std::string> ret;
ASSERT(count>=ZERO<T>()); // Check #1
ASSERT(count<std::numeric_limits<size_t>::max()); // Check #2
ret.reserve(size_t(count)); // Needs check #1 and #2 to succeed.
// ...
}
// ...
};
#1檢查編譯沒有警告,但#2檢查報告說comparison between signed and unsigned integer expressions
,因爲在這種特殊情況下的計數有符號的類型。如果我能說ASSERT((unsigned T) count < std::numeric_limits<size_t>::max())
或者類似的話......在這種情況下,轉換爲無符號T是安全的,因爲我們從檢查#1知道它至少爲零。
...或我可以使用什麼其他編譯器不可知的方法?
爲什麼檢查agains'的std :: numeric_limits :: MAX()'和'不是的std :: numeric_limits :: MAX()'? –
mfontanini
2013-05-09 12:20:40
,因爲我將使用該值作爲需要'size_t'類型參數的'.reserve()'的參數。你說的那個檢查總是如此,除非他們是平等的。 – Notinlist 2013-05-09 12:22:55