標準のコンテナから継承するのではなく、そのために設計されたものではありません。
また、前述のように、含まれている比較を多態的に動作させるには、参照またはポインターを格納する必要があります。ポインタの操作ははるかに簡単です。
メモリの解放について心配する必要をなくすために、スマートポインタ(std::unique_ptrまたはstd::shared_ptr)を使用してください。
次のスニペットは、独自のコンテナクラス(RC<>
)で均一な初期化を行う方法を含む、上記のほとんどの動作を示しています。
#include <unordered_map>
#include <memory>
struct Comparison {};
template <class T> struct Equal_to : Comparison { };
template <class T> struct Not_equal_to : Comparison { };
template <class T> struct Greater : Comparison { };
template <class T,class V>
class RC
{
typedef std::unordered_map<T,V> comps_t;
typedef typename comps_t::value_type value_type;
comps_t comps;
public:
RC(std::initializer_list<value_type> init) : comps(init) { }
};
int main(int argc, const char *argv[])
{
RC<std::shared_ptr<Comparison>, int> demo = {
{ std::make_shared<Equal_to<int>>(),10 },
{ std::make_shared<Not_equal_to<int>>(),30 },
{ std::make_shared<Greater<int>>(),20 } };
return 0;
}
(おそらく役に立たない最適化の部門では、他のコンストラクターのニーズと競合しない場合、完全な転送コンストラクターを持つことができます。これには、移動セマンティクスを正しくサポートするという利点があります。
template <typename... A>
RC(A&&... a) : comps(std::forward<A...>(a...)) { }