C ++:生成模板参数?

时间:2017-02-07 22:50:26

标签: c++ templates macros

我遇到了一个不幸的情况,我需要编写以下代码:

std::map<type1_key, type1_value, type1_cmp> x;
std::map<type2_key, type2_value, type2_cmp> y;
std::map<type3_key, type3_value, type3_cmp> z;
// ...

这些键/值/ cmp类型是为我预定义的。它们的类型名称都遵循_key,_value和_cmp模式(这些不是模板)。是否有内置的方法将其简化为

map_type<type1> x;
// ...

map_type(type1) x; // some kind of macro??
// ...

3 个答案:

答案 0 :(得分:5)

您可以使用以下宏:

   #define map_type( x ) std::map<x##_key, x##_value, x##_cmp>

然后,

map_type(type1) x;

答案 1 :(得分:4)

我发现宏解决方案更可取,但如果你不希望宏污染全局范围,这里是一个将信息包装在traits结构中的版本:

#define make_traits(T) \
struct T##_traits { \
  typedef T##_key key; \
  typedef T##_value value; \
  typedef T##_cmp cmp; \
}

make_traits(type1);
make_traits(type2);
make_traits(type3);

#undef make_traits

template<typename T>
using map_type =
  std::map<typename T::key, typename T::value, typename T::cmp>;

map_type<type1_traits> x;

答案 2 :(得分:1)

我建议使用类型系统更多的方法

template <std::size_t I>
struct kvc;

template <>
struct kvc<1> {
    using key = type1_key;
    using value = type1_value;
    using cmp = type1_cmp;
};
// Similar for the other types

template <std::size_t I>
using map_type = 
    std::map<typename kvc<I>::key, typename kvc<I>::value, typename kvc<I>::cmp>;

您可以使用宏自动创建专业化,但这样您可以更好地控制键/值/ cmp,并且(在我看来)会得到更好的错误。