创建模板化 vector 类时,允许使用其大小类型的最佳方式是什么?从我收集到的信息来看,它似乎是为真正的 vector 类创建一个接口(interface),然后使用它。比如
for(VectorBase::size_type i = 0; i < test1.size(); ++i)
这比
有优势for(Vector<int>::size_type i = 0; i < test1.size(); ++i)
为了使代码更简洁并且不必知道 Vector 的模板化类型(以防它发生变化)。
我的实现示例(如果有更好的方法,这里是我创建它的方法)。
class VectorBase
{
public:
typedef unsigned int size_type;
protected:
size_type mCount;
public:
VectorBase() { mCount = 2; }
virtual ~VectorBase() = 0 { }
size_type size() const { return mCount; }
};
template<typename Type>
class Vector : public VectorBase
{
public:
Vector() : VectorBase() { }
~Vector() { }
};
int main(void)
{
Vector<int> test1;
for(VectorBase::size_type i = 0; i < test1.size(); ++i)
{
cout << i << endl;
}
system("PAUSE");
return(0);
}
(注意:请不要将其变成“只需使用 xxx vector 类。”)。
最佳答案
not having to know the Vector's templated type (in case it changes).
如果您担心容器类型发生变化,可以:
- 为它创建一个typedef,所以
test1
使用您在循环中使用的相同类型名称声明,但该名称表示的类型将来可能会更改。 - 编写适当的通用函数,使容器的类型成为模板参数
T
或其他,你使用typename T::size_type
作为i
的类型.然后,如果类型发生变化,您的代码可以应对。
示例(1):
typedef vector<int> test_type;
test_type test1;
// populate the vector
for (test_type::size_type i = 0; i < test1.size(); ++i) std::cout << i << '\n';
例子(2):
template <typename Container>
void print_indexes(const Container &test1) {
for (typename Container::size_type i = 0; i < test.size(); ++i) {
std::cout << i << '\n';
}
}
替代解决方法:
1) 只需使用 std::size_t
.有点作弊,因为原则上我假设一个vector<bool>
可以有超过SIZE_MAX
元素,但没有“适当的” vector 可以变得比这更大。
2)(仅限 C++11)使用 auto
作为 i
的类型
for (auto i = test.size(); i != 0; --i) std::cout << (test.size() - i) << '\n';
或
for (decltype(test.size()) i = 0; i < test1.size(); ++i) ...
就我个人而言,我会遵循标准库中使用的样式,而不是为容器类模板使用通用基类。
关于c++ - 使用通用 vector 大小类型的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8824441/