C ++如何实现从类型到类型的编译时映射?
C++ How to implement a compile time mapping from types to types?
是否有编译时映射的canonical/reference实现,它将类型映射到类型?
例如,我需要来自 IBar -> IFoo
或 int -> IFoo
的类型映射。
在编译时,当给定 IBar
.
时,我可以 select IFoo
如何使用 C++17 来解决这个问题?
编辑:这是一个使用结构的示例 https://godbolt.org/z/EEvrYd9PE
您可以使用重载和 return 类型定义一个。这将像地图数据结构一样,您可以出于多种目的对多种类型进行初始化和重用。
template<typename T>
struct type_tag {
using type = T;
};
template<typename K, typename V>
struct pair {
using first_type = K;
using second_type = V;
};
template<typename Pair>
struct element {
static auto value(type_tag<typename Pair::first_type>) -> type_tag<typename Pair::second_type>;
};
template<typename... elems>
struct type_map : element<elems>... {
using element<elems>::value...;
template<typename K>
using find = typename decltype(type_map::value(type_tag<K>{}))::type;
};
你可以这样使用它:
using my_map = type_map<
pair<int, float>,
pair<char, double>,
pair<long, short>
>;
static_assert(std::is_same_v<my_map::find<int>, float>);
static_assert(std::is_same_v<my_map::find<char>, double>);
static_assert(std::is_same_v<my_map::find<long>, short>);
它应该非常快,因为查找仅限于 class 的范围,并且使用编译器自己的重载解析。
是否有编译时映射的canonical/reference实现,它将类型映射到类型?
例如,我需要来自 IBar -> IFoo
或 int -> IFoo
的类型映射。
在编译时,当给定 IBar
.
IFoo
如何使用 C++17 来解决这个问题?
编辑:这是一个使用结构的示例 https://godbolt.org/z/EEvrYd9PE
您可以使用重载和 return 类型定义一个。这将像地图数据结构一样,您可以出于多种目的对多种类型进行初始化和重用。
template<typename T>
struct type_tag {
using type = T;
};
template<typename K, typename V>
struct pair {
using first_type = K;
using second_type = V;
};
template<typename Pair>
struct element {
static auto value(type_tag<typename Pair::first_type>) -> type_tag<typename Pair::second_type>;
};
template<typename... elems>
struct type_map : element<elems>... {
using element<elems>::value...;
template<typename K>
using find = typename decltype(type_map::value(type_tag<K>{}))::type;
};
你可以这样使用它:
using my_map = type_map<
pair<int, float>,
pair<char, double>,
pair<long, short>
>;
static_assert(std::is_same_v<my_map::find<int>, float>);
static_assert(std::is_same_v<my_map::find<char>, double>);
static_assert(std::is_same_v<my_map::find<long>, short>);
它应该非常快,因为查找仅限于 class 的范围,并且使用编译器自己的重载解析。