C++ 成员和模板参数语法上的指针

C++ 成员和模板参数语法上的指针,c++,templates,C++,Templates,假设我们有一个接受类的结构模板,以及该类上一个成员的指针: struct A<A,&A::a> 结构A 我不能像那样声明模板 template<class T,class U> struct{}; 模板 结构{}; 我得写信 template<class T,typename T::type var> struct{}; 模板 结构{}; 为什么&A::A不能绑定到简单的类型名t语法中?在成为成员上的指针之前,&a::a是一种类型,因此我们

假设我们有一个接受类的结构模板,以及该类上一个成员的指针:

struct A<A,&A::a>
结构A 我不能像那样声明模板

template<class T,class U>
struct{};
模板
结构{};
我得写信

template<class T,typename T::type var>
struct{};
模板
结构{};
为什么
&A::A
不能绑定到简单的
类型名t
语法中?在成为成员上的指针之前,
&a::a
是一种类型,因此我们可以期望一个简单的类型名T可以工作,但事实并非如此。
&a::a
是一个值,而不是一种类型。因此,模板声明毫无意义

下面是它的工作原理:

template <typename A, int A::* Ptr> struct Foo { };

struct Bar { int n; };

int main()
{
    Foo<Bar, &Bar::n> f;
}
模板结构Foo{};
结构条{int n;};
int main()
{
福福;
}
或者,更一般地说

template <typename T, typename U, U T::* Ptr> struct Foo { };

Foo<Bar, int, &Bar::n> f;
模板结构Foo{};
福福;