[英]Defining a template for case-insensitive maps
目标:带有字符串键的std映射的模板+可选的true / false param,以区分大小写
使它按如下方式工作,但结果很难看-必须有更好的方法!
//step 1: templated typdefs for case-insensitive (ci), case-sensitive (cs) maps
template <typename T> struct ci_map { typedef std::map<std::string, T, ci_compare_string> type; }; //ci version
template <typename T> struct cs_map { typedef std::map<std::string, T > type; }; //cs version
//step 2: a template specialized to select on the of the two versions
template<typename T, bool ci> struct map_choice { }; //empty decl
template<typename T> struct map_choice<T, true> { typedef ci_map<T> map_version; }; //specialize ci = true
template<typename T> struct map_choice<T, false> { typedef cs_map<T> map_version; }; //specialize ci = false
//final step, but VS 2008 compile error: 'map_choice<T,ci>::map_version::type': dependent name is not a type
template<typename T, bool ci=true>
struct mymap { typedef map_choice<T, ci>::map_version::type type; };
//too bad ... usage would have been concise ==> "mymap<int>::type mymap_instance;"
//final step: works, but ugly
template<typename T, bool ci=true>
struct mymap { typedef map_choice<T, ci> type; };
//usage (ugly !!!)
mymap<int>::type::map_version::type mymap_instance; //ouch
有什么改进建议吗?
template<typename T, bool ci=true>
struct mymap { typedef typename map_choice<T, ci>::map_version::type type; };
将正常工作。 阅读: 为什么必须在何处以及为什么要放置“ template”和“ typename”关键字?
这个怎么样:
template <bool ci>
struct Comparator
{
typedef ci_compare_string type;
};
template<>
struct Comparator<false>
{
typedef std::less<std::string> type;
};
template <typename T, bool ci = true>
struct mymap
{
typedef std::map<std::string, T, typename Comparator<ci>::type> type;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.