У меня есть класс "События". Из-за пути даты обрабатываются, мы должны перенести этот класс в класс "UIEvent", который проводит Мероприятие и дата События в другом формате.
Каков лучший способ позволить преобразование от События до UIEvent и назад? Я думал, перегружая присвоение или конструктора копии UIEvent, чтобы признать, что События (и наоборот) могли бы быть лучшими.
Я могу придумать два простых варианта.
Первым вариантом будет тот, который вы описываете: создайте конструктор, который принимает объект другого типа:
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);
Преимущество этого способа состоит в что существует меньшая прямая связь между классами. С другой стороны, иногда классы так или иначе связаны естественным образом, и в этом случае первый вариант может иметь такой же смысл и быть менее громоздким.
Если вы можете преобразовать событие
в 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 () ()
в приведенном выше функциональном объекте, чтобы вы могли использовать тот же функциональный объект для других преобразований.