我们过度使用模板,并且我们不能始终告诉手头类型的签名,所以我们需要技巧来隐藏最终会优化的警告。我有一个简单的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