paq*_*etp 0 c++ generics templates stl
考虑使用数组的以下算法:
class MyType;
{
// some stuff
}
class MySubType:MyType
{
// some stuff
}
void foo(MyType** arr, int len)
{
for (int i = 0;i<len;i++)
// do something on arr[i]->
}
void bar()
{
MySubType* arr[10];
// initialize all MySubType*'s in arr
foo(&arr, 10);
}
Run Code Online (Sandbox Code Playgroud)
这里没什么太花哨的.我的问题是 - 如何使用模板执行此操作?
void foo(std::vector<MyType>& s)
{
std::vector<MyType>::iterator i;
for (i = s.begin(); i != s.end(); i++)
// do stuff on *i
}
Run Code Online (Sandbox Code Playgroud)
所以,在酒吧,我不能这样做:
void bar()
{
std::vector<MySubType> s;
foo(s); // compiler error
}
Run Code Online (Sandbox Code Playgroud)
错误:类型std::vector<MyType, std::allocator<MyType> >&表达式中类型引用的初始化无效std::vector<MySubType, std::allocator<MySubType> >
有办法做这样的事吗?
基本上,如果有办法做到这一点:
std::vector<MySubType> s;
std::vector<MyType>& t = s;
Run Code Online (Sandbox Code Playgroud)
我会幸福的...
这可能会解决您的问题
template <typename T>
void foo(std::vector<T>& s)
{
typename std::vector<T>::iterator i;
for (i = s.begin(); i != s.end(); i++)
// do stuff on *i
}
Run Code Online (Sandbox Code Playgroud)
为了扩展kuoson的答案,惯用的C++风格是将迭代器传递给函数而不是容器.
template<typename Iterator>
void foo(const Iterator & begin, const Iterator & end)
{
Iterator i;
for (i = begin; i != end; ++i)
// do stuff on *i
}
Run Code Online (Sandbox Code Playgroud)