我有两个类:A
和B
,以及从A
到B
的隐式转换。我还有vector<A>
,我想将其转换为vector<B>
。是否可以添加允许我隐式或明确地将vector<A>
转换为vector<B>
的转换?
我知道我可以使用described here技术,但有没有办法在两者之间进行隐式转换?或者是明确的转换?
答案 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);
谢谢大家。