获取 [枚举成员?] 的封闭类型

get the enclosing type of an [enum member?]

本文关键字:类型 枚举成员 获取      更新时间:2023-10-16
struct class1
{
    enum res
    {
        a = 9,
        b = 15
    };
    class1(res e) { }
};
struct class2
{
    enum res
    {
        he = 5,
        de = 2
    };
    class2(res e) {}
};
template<typename T, typename E>
void fn(E e)
{
    foo(T(e));
}

这个函数有效,例如我可以像fn<class2>(class2::he));一样调用它,但我不想显式指定class2两次。

有没有办法根据class2::he推断出类型"class2"?

定义一些辅助元函数来获取你想要的类型怎么样?

#include <type_traits>
struct class1
{
    enum res
    {
        a = 9,
        b = 15
    };
    class1(res e) { }
};
struct class2
{
    enum res
    {
        he = 5,
        de = 2
    };
    class2(res e) {}
};
auto get_enclosing_type(class1::res) -> class1;
auto get_enclosing_type(class2::res) -> class2;
template <typename T>
using get_enclosing_type_t = decltype(get_enclosing_type(std::declval<T>()));
template<typename E>
void fn(E const e)
{
    using type = get_enclosing_type_t<E>;
    foo(type {e});
}