C++如何实现从类型到类型的编译时映射?

是否有编译时映射的规范/参考实现,将类型映射到类型?

例如,我需要一个类型映射 fromIBar -> IFoo或 from int -> IFoo

在编译时,我可以IFoo在给定IBar.

如何使用 C++17 解决这个问题?

编辑:这是一个使用结构的例子https://godbolt.org/z/EEvrYd9PE

回答

您可以定义一个重载和返回类型。这将就像一个地图数据结构,您可以出于多种目的使用多种类型对其进行初始化和重用。

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

活生生的例子

它应该非常快,因为查找仅限于类的范围,并且使用编译器自己的重载解析。


以上是C++如何实现从类型到类型的编译时映射?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>