我遇到了一个不幸的情况,我需要编写以下代码:
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??
// ...
答案 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,并且(在我看来)会得到更好的错误。