我们过度使用模板,我们不能总是告诉手头类型的签名,所以我们需要技术来隐藏最终将被优化的警告。我有一个简单的ASSERT(condition)
宏,如果条件不为真,它会抛出一些东西。
目标是检查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 中知道它至少为零。
...或者我可以使用其他与编译器无关的方法吗?