目标:需要为函数的定义建立一个map,特殊之处在于这个map是multikey的,一个string的namespace uri,一个string的name,一个unsigned int的argument size。用伪语言写起来应该是这样的:
map < (namespace uri, name, arg size), function definition pointer> functionMap;
1、首先我想到的解决方案是使用boost的multi index container来做这件事,于是我参考了如下两篇文章:
文章一:http://blog.csdn.net/gongxinheng/article/details/5421914
文章二:http://blog.csdn.net/livelylittlefish/article/details/6098912 (这篇文章专门介绍了组合查询,更为贴合我的任务)
在参考了第二篇文章后我发现其实最后的map还是一个single key的map,只不过key本身是一个composite key。所以我放弃了使用Boost库的念头。
2、所以我本身要用的只是针对一个composite key做map,接下来我参考了下面这篇文章:
http://stackoverflow.com/questions/10276358/std-map-composite-key
这篇帖子提供了一篇关于composite key的更为详细的描述:http://cnx.org/content/m35767/latest/,提供了另外一种实现的方式,在对象已经拥有了compare less operator的情况下使用起来更方便,值得一看。
3、所以我最后得到的是这么个东西:
class FunctionDefnKey {
public:
string uri_;
string name_;
unsigned int argSize_;
FunctionDefnKey(string uri, string name, unsigned int argSize)
: uri_(uri), name_(name), argSize_(argSize) {}
friend bool operator<(const FunctionDefnKey& mk1, const FunctionDefnKey& mk2) {
if (mk1.uri_ != mk2.uri_ ) {
return mk1.uri_ < mk2.uri_;
} else if ( mk1.name_ != mk2.name_) {
return mk1.name_ < mk2.name_;
} else {
return mk1.argSize_ < mk2.argSize_;
}
}
map< FunctionDefnKey, FunctionDefn* > externFuncMap_;
};
这要比使用boost来的简单易懂多了。