带有泛型键的c++ std::map类

c++ std::map class with generic key

本文关键字:std map c++ 泛型      更新时间:2023-10-16

我有一个类族,每个子类都需要一个映射,但是键具有不同的类型,尽管它们都将对映射执行完全相同的操作。两种情况下的值都是string。到目前为止,我有类似于下面示例的代码,我的目标是重用代码,通过具有通用密钥。不使用STL

以外的任何其他库
class A{
 public:
    /*
     * More code
     */
};

class subA1 : public A{
public:
    void insertValue(long id, std::string& value){
        if(_theMap.find(id) == _theMap.end())
        {
            _theMap[id] = value;
        }
    }
 private:
     std::map<long,std:string> _theMap;
};
class subA2 : public A{
public:
    void insertValue(std::string& id, std::string& value){
        if(_theMap.find(id) == _theMap.end())
        {
            _theMap[id] = value;
        }
    }
private:
     std::map<std::string,std:string> _theMap;
};

只需将超类A作为模板,将_theMap和insertValue()移到其中,并在子类中使用正确的模板版本。

template <typename KeyT>
class A{
 public:
   void insertValue(KeyT id, std::string& value){
        if(_theMap.find(id) == _theMap.end())
        {
            _theMap[id] = value;
        }
    }
 private:
     std::map<KeyT, std:string> _theMap;
};
class subA1 : public A<long> {};
class subA2 : public A<std::string> {};

可以将subA1subA2合并为一个模板类,例如:

class A{
 public:
    /*
     * More code
     */
};
template <typename KeyType>
class subA : public A {
public:
    void insertValue(const KeyType &id, const std::string& value) {
        if(_theMap.find(id) == _theMap.end()) {
            _theMap.insert(std::make_pair(id, value));
        }
    }
 private:
     std::map<KeyType, std:string> _theMap;
};

然后可以根据需要创建类型定义:

typedef subA<long> subA1;
typedef subA<std::string> subA2;

或者,如果您需要实际的派生类:

class subA1 : public subA<long>
{
    ...
 };
class subA2 : public subA<std::string>
{
    ...
};

如何写另一个小的基类,说C<T>,这是一个template typename T,只包括map<T, string>和你的insert函数。那么A的每个新子类也将是C的一个子类。所以你的subA1就是public A, public C<long>等等