考虑具有成员变量的类,如下所示:
struct A {
int a;
char b;
};
struct B {
double c;
bool d;
};
Run Code Online (Sandbox Code Playgroud)
是否可以声明一个模板类,该模板类接受作为其模板参数的指针到成员对象,指向上述类中声明的任何一个成员?可以声明并使用接受通用指针到成员对象的类,如下所示:
template<typename Class, typename Type, Type (Class::*Member)>
struct Magic
{ };
// Usage:
typedef Magic<A, int, &A::a> MagicWithA_a;
Run Code Online (Sandbox Code Playgroud)
不幸的是,每次都要传递Class和
Type模板参数以使最终指针工作是非常麻烦的.
例如,有没有办法让部分专业化推断出这些论点?也就是说,如何Magic声明类以使下面的定义有效?
typedef Magic<&B::c> MagicWithB_c;
typedef Magic<&A::b> MagicWithA_b;
Run Code Online (Sandbox Code Playgroud)
使用C++ 17,您可以使用auto非类型模板参数:
template<auto p_member>
struct Magic
{ };
Run Code Online (Sandbox Code Playgroud)
在C++ 17之前,只有您实现的较长变体才有效.