在矢量之间转换

时间:2015-02-11 22:36:36

标签: c++ templates implicit-conversion explicit-conversion

我有两个类:AB,以及从AB的隐式转换。我还有vector<A>,我想将其转换为vector<B>。是否可以添加允许我隐式或明确地将vector<A>转换为vector<B>的转换?

我知道我可以使用described here技术,但有没有办法在两者之间进行隐式转换?或者是明确的转换?

4 个答案:

答案 0 :(得分:2)

通常您不应该这样做,因为vector<A>vector<B>具有不同的实现(特别是如果vector是模板专门化,如vector<bool>)。

如果你不喜欢复制矢量,请从其他角度看一下:你需要vector<A>表现vector<B>:你需要转换接口而不是实施。实现具有重载vector<A>operator* operator-> {{1}}的适配器,就像B一样。

答案 1 :(得分:1)

间接地,有。它可能不是你想要的,
但你可以让你的功能成为接受的模板 迭代器对作为参数:

void doSomething( const B& );

template<typename Itr>
void foo1( Itr beg, Itr end )
{
    while( beg != end )
        doSomething(*beg++);
}

void foo2()
{
    vector<A> vec;
    foo1( vec.begin(), vec.end() );
}

答案 2 :(得分:1)

一个继承vector&lt;的类A&gt;和另一个继承vector&lt; B>并实现将另一个类作为参数的构造函数。

答案 3 :(得分:0)

我希望在C#的基础上有一个技巧,以及C ++的模板专业化。像这样:

template<>                                                     // C++ specialization
vector<B>::operator vector<A>(this const vector<A> &vec) const // c# extension method
{
    return vector<C>(vec.begin(), vec.end());
}

然后我可以简单地说明:

vector<A> va;
vector<B> vb = va;

唉,这在C ++中是不可能的,所以我只是添加一个全局函数:

vector<B> ConvertToB(const vector<A> &vec);

谢谢大家。