2015-02-11 2 views
1

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

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

+3

Ваша ссылка «описано здесь» дает один ответ на ваш вопрос. Что вам не нравится в этом ответе? –

+0

Эта одна строка заставляет меня описывать * how *, чтобы сделать преобразование в моем коде, а не просто, что я хочу сделать преобразование. Это слишком много. – zmbq

ответ

2

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

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

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

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

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); 

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