将指针作为非类型模板参数传递给数据成员时推断类型和 class

Inferring type and class when passing a pointer to data member as a non-type template argument

我需要将指向数据成员的指针、它的类型和它所属的 class 传递给模板结构。以下作品:

template<typename T, typename Cls, T Cls::*member> struct Member {};
struct Struct { int x; };
Member<int, Struct, &Struct::x>

但它需要明确提及类型 (T: int) 和 class (Cls: Struct)。那应该是不必要的。编译器应该能够自己找出这两种类型。

事实上,如果我将指向数据成员的指针传递给函数,它可以推断出它们:

template<typename T, typename Cls> void member( T Cls::*member ) {}
struct Struct { int x; };
member( &Struct::x );

是否可以将指向数据成员的指针作为非类型模板参数传递,同时让编译器确定类型和class?

您可以使用帮助程序从成员指针的类型中获取 class 和成员的类型:

template <typename T> struct type_from_member;

template <typename Cls,typename M>
struct type_from_member<M Cls::*> {
    using class_type = Cls;
    using member_type = M;
};

然后你可以使用auto并从助手继承:

template <auto member> struct Mem : type_from_member<decltype(member)> {};

using B = Mem<&Struct::x>;

static_assert( std::is_same_v<B::member_type,int>);
static_assert( std::is_same_v<B::class_type,Struct>);