说我们有一个带有类的结构模板,以及一个指向该类成员的指针:
struct A<A,&A::a>
我不能像那样声明模板
template<class T,class U>
struct{};
我必须写
template<class T,typename T::type var>
struct{};
为什么&A::a
无法绑定到简单的typename T
语法中?在成为成员的指针之前,&A::a
是一种类型,所以我们可以期望一个简单的类型名称T可以工作,但事实并非如此
答案 0 :(得分:2)
&A::a
是值,而不是类型。所以模板声明毫无意义。
以下是它的工作原理:
template <typename A, int A::* Ptr> struct Foo { };
struct Bar { int n; };
int main()
{
Foo<Bar, &Bar::n> f;
}
或者,更一般地说,
template <typename T, typename U, U T::* Ptr> struct Foo { };
Foo<Bar, int, &Bar::n> f;