我有一个结构模板,例如:
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>
的字符串}
答案 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