Преобразование между векторами

У меня есть два класса: A а также Bи неявное преобразование из Aс Bs. у меня тоже есть vector<A>и я хочу преобразовать его в vector<B>, Можно ли добавить преобразование, которое позволило бы мне явно или неявно преобразовать vector<A> в vector<B>?

Я знаю, что могу использовать технику описано здесь, но есть ли способ включить неявное преобразование между ними? Или явное преобразование?

1

Решение

Как правило, вы не должны этого делать, потому что vector<A> а также vector<B> имеют различную реализацию (особенно, если вектор является специализацией шаблона, как vector<bool>).

Если вам не нравится копировать вектор, взгляните с другой точки зрения: вам это нужно vector<A> будет вести себя vector<B>: вам нужно конвертировать интерфейсы не реализация. Реализация адаптера для vector<A> с перегрузкой operator* а также operator-> который бы действовал как B, это то, что вам нужно.

2

Другие решения

Косвенно, есть. Это может быть не то, что вы ищете,
но вы могли бы иметь свои функции шаблонов, которые принимают
пары итераторов в качестве аргумента:

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() );
}
1

Один класс, который наследует вектор< A> и другой класс, который наследует вектор< B> и реализовать конструктор, который принимает другой класс в качестве параметра.

1

Я надеялся на хитрость по линии 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);

Спасибо всем.

0
По вопросам рекламы [email protected]