推导指向成员的模板参数

Kam*_*jii 4 c++ templates

考虑具有成员变量的类,如下所示:

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)

不幸的是,每次都要传递ClassType模板参数以使最终指针工作是非常麻烦的.

例如,有没有办法让部分专业化推断出这些论点?也就是说,如何Magic声明类以使下面的定义有效?

typedef Magic<&B::c> MagicWithB_c;
typedef Magic<&A::b> MagicWithA_b;
Run Code Online (Sandbox Code Playgroud)

use*_*670 6

使用C++ 17,您可以使用auto非类型模板参数:

template<auto p_member>
struct Magic
{ };
Run Code Online (Sandbox Code Playgroud)

在C++ 17之前,只有您实现的较长变体才有效.