Присвоение вектора одного типа к вектору другого типа

У меня есть класс "События". Из-за пути даты обрабатываются, мы должны перенести этот класс в класс "UIEvent", который проводит Мероприятие и дата События в другом формате.

Каков лучший способ позволить преобразование от События до UIEvent и назад? Я думал, перегружая присвоение или конструктора копии UIEvent, чтобы признать, что События (и наоборот) могли бы быть лучшими.

6
задан deworde 14 April 2010 в 01:18
поделиться

2 ответа

Я могу придумать два простых варианта.

Первым вариантом будет тот, который вы описываете: создайте конструктор, который принимает объект другого типа:

struct UIEvent
{
    UIEvent(const Event&);
};

и используйте std :: copy для копирования элементов из вектора одного типа в вектор другого:

std::vector<Event> eventVector;
std::vector<UIEvent> uiEventVector;

std::copy(eventVector.begin(), eventVector.end(), 
          std::back_inserter(uiEventVector));

Второй вариант - написать функцию преобразования, не являющуюся членом:

UIEvent EventToUIEvent(const Event&);

и использовать std :: transform :

std::transform(eventVector.begin(), eventVector.end(), 
               std::back_inserter(uiEventVector), &EventToUIEvent);

Преимущество этого способа состоит в что существует меньшая прямая связь между классами. С другой стороны, иногда классы так или иначе связаны естественным образом, и в этом случае первый вариант может иметь такой же смысл и быть менее громоздким.

19
ответ дан 8 December 2019 в 04:29
поделиться

Если вы можете преобразовать событие в UIEvent (например, если UIEvent имеет конструктор, который принимает событие ] как параметр), то следующий вектор будет назначать один вектор другому:

uievent_vector.reserve(event_vector.size());
uievent_vector.assign(event_vector.begin(), event_vector.end());

Естественно, обратный путь также будет работать, если это преобразование работает.

В качестве альтернативы вы можете использовать std :: copy () , чтобы получить тот же эффект. Если вы не можете выполнить преобразование одним способом внутри интерфейса класса, напишите функцию, которая выполняет преобразование, а затем используйте std :: transform () :

struct to_uievent {
    UIEvent operator()(const Event& e) {
        // ...
    }
};

// ...
    std::transform(event_vector.begin(), event_vector.end(),
                   back_inserter(uievent_vector),
                   to_uievent());

Вы, конечно, можете добавить столько перегрузок, сколько вы хотите operator () () в приведенном выше функциональном объекте, чтобы вы могли использовать тот же функциональный объект для других преобразований.

6
ответ дан 8 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: