У меня есть два класса: A
а также B
и неявное преобразование из A
с B
s. у меня тоже есть vector<A>
и я хочу преобразовать его в vector<B>
, Можно ли добавить преобразование, которое позволило бы мне явно или неявно преобразовать vector<A>
в vector<B>
?
Я знаю, что могу использовать технику описано здесь, но есть ли способ включить неявное преобразование между ними? Или явное преобразование?
Как правило, вы не должны этого делать, потому что vector<A>
а также vector<B>
имеют различную реализацию (особенно, если вектор является специализацией шаблона, как vector<bool>
).
Если вам не нравится копировать вектор, взгляните с другой точки зрения: вам это нужно vector<A>
будет вести себя vector<B>
: вам нужно конвертировать интерфейсы не реализация. Реализация адаптера для vector<A>
с перегрузкой operator*
а также operator->
который бы действовал как B, это то, что вам нужно.
Косвенно, есть. Это может быть не то, что вы ищете,
но вы могли бы иметь свои функции шаблонов, которые принимают
пары итераторов в качестве аргумента:
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() );
}
Один класс, который наследует вектор< A> и другой класс, который наследует вектор< B> и реализовать конструктор, который принимает другой класс в качестве параметра.
Я надеялся на хитрость по линии 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);
Спасибо всем.