collection<T>
インターフェイスにこのようなmap
メンバー機能を追加するにはどうすればよいですか?
短い答えは:あなたはありません。私がcollection<int>
をいくつか持っていて、それにmap
std::to_string
を入れたいのであれば、collection<std::string>
を作る必要があります。しかし、vector_collection<int>
はvector_collection<std::string>
を生成する必要があり、list_collection<int>
はlist_collection<std::string>
を生成する必要があるため、タイプ変換自体はvirtual
にする必要があります。しかし、あなたはvirtual
メンバ関数テンプレートを持つことができないので、これを表現する方法はありません。
これを実行するには、コンテナに入れているすべてのオブジェクトに共通の基本タイプを設定してから、共通のファサードを作成する必要があります。つまり、あなたは実際にcollection<unique_ptr<Object>>
しか持っていません。map
はちょうどあなたに異なるcollection<unique_ptr<Object>>
を与え、map
はをcollection_facade<std::string, collection<unique_ptr<Object>>>
にします。多くの作業とパフォーマンスと型の安全性について完全な無視をすれば、そこに行くことができます。
これはテンプレートの利点です。
template <class T, class A, class F, class R = std::result_of_t<F(T)>>
std::vector<R, A> map(std::vector<T, A> const& v, F f) {
std::vector<R, A> mapped;
mapped.reserve(v.size());
for (T const& elem : v) {
mapped.push_back(f(elem));
}
return mapped;
}
か::私はvector
のようなもののためにmap
を書きたい場合は、私はちょうどそれを書くことができます
template <class T, class A, class F, class R = std::result_of_t<F(T)>>
std::vector<R, A> map(std::vector<T, A> const& v, F f) {
return std::vector<R, A>(
boost::make_transform_iterator(v.begin(), f),
boost::make_transform_iterator(v.end(), f)
);
}
を私は別に、各コンテナのmap()
を実装する必要があります - しかし、私はそれをしなければならないでしょうとにかくそして、今私は何も与えていない。さらに、実行時コンテナに依存しないアルゴリズムをどのくらい頻繁に記述していますか?
C++標準コンテナの何が問題ですか? –
@πάνταῥεῖOPは学習目的でこれをやろうとしています。 –
何も私はちょうど教育目的のためのそのようなものを実装する方法を知りたい – Exagon