【发布时间】:2017-12-29 14:05:38
【问题描述】:
假设我有一个带有std::vector<bool> a 和std::vector<int> b 字段的类,我想在构造函数中将reserve() 设置为两个容器相等的大小。鉴于 reserve() 接受 size_type 参数,为了完全安全,我必须 - 据我了解 - 使用两个参数编写构造函数,这并不是特别吸引人:
MyCtor(std::vector<bool>::size_type size1, std::vector<int>::size_type size2)
{
abortIfNotEqual(size1, size2); // Proceed only if size1 == size2
a.reserve(size1);
b.reserve(size2);
}
根据我的阅读,size_type通常与size_t 相同,至少对于标准容器而言,所以我可以这样做而不会遇到任何潜在问题:
MyCtor(std::size_t size)
{
a.reserve(size); // More readable, but is this always ok?
b.reserve(size);
}
但是,有没有更好、更安全的方法来严格使用size_type,而不必通过特定类型T 的特定container<T> 访问它?
必须使用特定的container<T> 也很烦人,例如访问一个元素:对于a[i],i 必须是std::vector<bool>::size_type,因为我假设使用例如unsigned int i 会不太安全。
在这种情况下,是否有一种通用的、通用的、更易读的方法?还是我应该简单地使用size_t 甚至unsigned long int 而忘记这个?
【问题讨论】:
-
我知道这不是规范,但您可以只使用
std::int64_t甚至可能同时使用int,这甚至可以让您断言没有人在调用函数时意外产生负值。如果您想听听知名委员会成员的类似建议:channel9.msdn.com/Events/GoingNative/2013/… 9:50, 42:40, 1:02:50 -
顺便说一句,您的问题的直接答案可能是
std::common_type,但我再次认为这是矫枉过正。 -
由于
std::size_t必须足够大以表示已分配内存的最大大小,并且由于向量中的所有对象的大小都大于1,因此std::size_t可以表示任何向量的大小。 -
@Oliv 这适用于字节,但
std::vector<bool>索引位,所以不需要帮助。 -
您可以使用
size_t和静态断言,它与vector<T>::size_type相同。它既安全又可读。