微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将指向数据成员的指针作为非类型模板参数传递时推断类型和类

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

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

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

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

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

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

解决方法

可以使用helper从成员指针的类型中获取类和成员的类型:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。