1

我有两个类:Aand B,以及从As 到Bs 的隐式转换。我也有一个vector<A>,我想把它转换成vector<B>. 是否可以添加一个允许我隐式或显式转换vector<A>为的转换vector<B>

我知道我可以使用这里描述的技术,但是有什么方法可以实现两者之间的隐式转换吗?还是显式转换?

4

4 回答 4

2

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

如果您不喜欢复制向量,请从其他角度看一下:您需要它的vector<A>行为vector<B>:您需要转换接口而不是实现vector<A>为with 重载operator*operator->行为像 B 的适配器是您需要的。

于 2015-02-11T22:50:32.217 回答
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() );
}
于 2015-02-11T22:56:22.457 回答
1

一个类继承vector< A >,另一个类继承vector< B > 并实现将另一个类作为参数的构造函数。

于 2015-02-12T01:22:29.073 回答
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);

谢谢大家。

于 2015-02-12T06:32:31.047 回答