Вы бы предпочли не наследовать от стандартных контейнеров, они не были предназначены для него.
Также, как уже упоминалось, для того, чтобы содержащиеся Сравнения вели себя полиморфно, вам нужно либо хранить ссылки, либо указатели. С указателями работать намного проще.
Чтобы не беспокоиться об освобождении памяти, используйте умные указатели (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...)) { }