「イベント」クラスがあります。日付の処理方法により、このクラスを、イベントを保持する「UIEvent」クラスでラップし、イベントの日付を別の形式でラップする必要があります。
イベントからUIEventへの変換とその逆の変換を許可する最良の方法は何ですか?イベントを受け入れるためにUIEventの代入またはコピーコンストラクターをオーバーロードする(またはその逆)のが最善かもしれないと思いました。
「イベント」クラスがあります。日付の処理方法により、このクラスを、イベントを保持する「UIEvent」クラスでラップし、イベントの日付を別の形式でラップする必要があります。
イベントからUIEventへの変換とその逆の変換を許可する最良の方法は何ですか?イベントを受け入れるためにUIEventの代入またはコピーコンストラクターをオーバーロードする(またはその逆)のが最善かもしれないと思いました。
私が考えることができる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));
2番目のオプションは、非メンバー変換関数を作成することです。
UIEvent EventToUIEvent(const Event&);
と使用std::transform
:
std::transform(eventVector.begin(), eventVector.end(),
std::back_inserter(uiEventVector), &EventToUIEvent);
この方法の利点は、クラス間の直接結合が少ないことです。一方、クラスがとにかく自然に結合される場合もあります。その場合、最初のオプションは同じくらい意味があり、煩わしさが少なくなる可能性があります。
Event
をに変換できる場合UIEvent
(たとえば、 as パラメーターUIEvent
を取るコンストラクターがある場合Event
)、次のように 1 つのベクターを別のベクターに割り当てます。
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()()
上記の関数オブジェクトに好きなだけオーバーロードを追加できるので、同じ関数オブジェクトを他の変換に使用できます。