为不区分大小写的映射定义模板

时间:2013-02-21 13:02:24

标签: c++ templates

目标:std地图的模板w字符串键+区分大小写的可选true / false参数

按照以下方式工作,但结果很难看 - 必须有更好的方法!

//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

有任何改进建议吗?

2 个答案:

答案 0 :(得分:2)

template<typename T, bool ci=true> 
struct mymap { typedef typename map_choice<T, ci>::map_version::type type; };

工作正常。阅读:Where and why do I have to put the "template" and "typename" keywords?

答案 1 :(得分:2)

这个怎么样:

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;
};