用于操作Base/Derived对象的容器的函数

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)

我会幸福的...

osc*_*kuo 8

这可能会解决您的问题

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)


Mar*_*som 6

为了扩展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)