特殊模板功能的功能

时间:2017-11-24 20:16:04

标签: c++ c++11 templates

我有一个结构模板,例如:

template<typename KEY_T, typename VAL_T> 
struct pair
{
    KEY_T key; VAL_T val;
};

VAL_T val可能是不同的(字符串,列表或其他) 我想要的是为指定的模板结构 operator[]重载pair<std::string, std::list>,并且只为它重载。 怎么可能?

P.S。我正在编写一个Ini-parser,我想访问settings[Section][Key]之类的设置,其中settings[Section]返回pair<std::string, std::list<Entry>>settings[Section][Key]然后返回std::list<Entry>的字符串}

2 个答案:

答案 0 :(得分:2)

类模板可以是部分专用的:

template<typename T> 
struct pair<std::string, std::list<T>>
{
    std::string key;
    std::list<T> val;
    T& operator[](...) {
      //implement
    }
};

或完全:

template<> 
struct pair<std::string, std::list<Entry>>
{
    std::string key;
    std::list<Entry> val;
    Entry& operator[](...) {
      //implement
    }
};

作为旁注,请考虑将您的类放在指定的命名空间中。如果您还需要使用std::pair,则更易于管理。

答案 1 :(得分:0)

你可以这样做。

template <typename KEY, typename VAL>
struct pair
{
    KEY _key;
    VAL _val;
    pair (const KEY& key, const VAL& val):
         _key(key), _val(val)
    {};
    // ... here is the trick
    friend ENTRY& get(pair<std::string, std::list<ENTRY>>& p, size_t idx)
};
ENTRY& get(pair<std::string, std::list<ENTRY>>& p, size_t idx)
{
    return p._val [idx];
};

你的问题不明确,你说:

Settings[Section] -> pair <string, list<entry>>;

Settings[Section][Key]-> list<entry>;?整个列表对象??

你要找的东西可以这样做:

std::map<std::string, std::map<std::string, std::string>> Settings;
std::string my_value = Settings[Section][Key];

Settings是地图地图:

[Color] <-- this is the section
pen = blue <-- this is the pair KEY:VALUE
border = green
canvas = black