C++ 获取[enum成员?]的封闭类型 struct类1 { 枚举资源 { a=9, b=15 }; 类别1(rese){} }; 结构类2 { 枚举资源 { 他=5, de=2 }; 类别2(rese){} }; 模板 无效fn(E) { foo(T(e)); }

C++ 获取[enum成员?]的封闭类型 struct类1 { 枚举资源 { a=9, b=15 }; 类别1(rese){} }; 结构类2 { 枚举资源 { 他=5, de=2 }; 类别2(rese){} }; 模板 无效fn(E) { foo(T(e)); },c++,C++,这个函数可以工作,我可以像fn(class2::he)那样调用它,但我不想显式地指定class2两次 有没有一种方法可以根据class2::he推断出类型“class2”?如何定义一些帮助器元函数以获得所需的类型 struct class1 { enum res { a = 9, b = 15 }; class1(res e) { } }; struct class2 { enum res { h

这个函数可以工作,我可以像
fn(class2::he)那样调用它,但我不想显式地指定
class2
两次


有没有一种方法可以根据
class2::he
推断出类型“class2”?

如何定义一些帮助器元函数以获得所需的类型

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));
}
#包括
结构类别1
{
枚举资源
{
a=9,
b=15
};
类别1(rese){}
};
结构类2
{
枚举资源
{
他=5,
de=2
};
类别2(rese){}
};
自动获取封闭类型(class1::res)->class1;
自动获取封闭类型(class2::res)->class2;
模板
使用get_enclosuring_type_t=decltype(get_enclosuring_type(std::declval());
模板
无效fn(E常数E)
{
使用类型=获取封闭类型;
foo(类型{e});
}

我现在不知道是否存在这样的方法,但至少有一点麻烦:您可以使用
static constexpr
consts和类似
using base=/*class1或class2*/的类替换枚举内部。您如何区分
类C1{enum E1{};类C2{使用E2=C1::E1}
from
类C2{enum E2{};类C1{使用E1=C2::E2}
?C++在类型和名称之间有细微的区别。特别是,一种类型可能有多个(嵌套)名称。模板中的类型推断为您提供了一个类型以及该类型的另一个名称。(此处
typename T
#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});
}