将成员名称作为模板参数传递,由 T 的指针引用
passing name of member as template argument, referenced by pointer of T
如何将指针成员传递给模板参数?
很难解释,所以我将显示一个非常短的代码来指出问题。
这是一个有效的代码:-
template<class T, int T::*a> class B{...}
class A{ public: int mem; }
int main(){
A a;
B<A,&A::mem> b= B<A,&A::mem>(a); // I pass "A" as value
}
现在我想传递指针而不是值,如下所示:-
template<class T, int T::*a> class B{...}
class A{ public: int mem; }
int main(){
A* a=new A(); //changed
B<A*,&A*::mem> b= B<A*,&A*::mem>(a); //changed, pass "A*" (#)
}
这是我遇到的编译错误。
prog.cpp:18:13: error: template argument 2 is invalid
B<A*,&A*::mem> b=B<A*,&A*::mem>(a);
^
我在行 (#) 上错了。我应该如何编辑该行?
编辑
这是完整的代码:-
class A{
public: int x=2;
};
template <class T, int T::*a> class B{
T objectA_;
public: B(T objectA){
objectA_ = objectA;
}
public: void print(){
std::cout<< objectA_.*a ;
}
};
int main() {
A objectA; objectA.x=3;
B<A,&A::x> objectB=B<A,&A::x>(objectA); //this line will be changed
objectB.print(); //print 3
return 0;
}
注意 T=A。
现在,我想要 T=A*.
新版本
template <class T, int A::*a> class B{
T objectA_;
public: B(T objectA){
objectA_ = objectA;
}
public: void print(){
std::cout<< objectA_->*a ; //changed
}
};
int main() {
A* objectA = new A(); objectA->x=3; //changed
B<A*,&A*::x> objectB=B<A*,&A*::x>(objectA); //changed
objectB.print();
delete objectA; //new
return 0;
}
B<A, &A::mem>
仍然是正确的形式。您需要更改的是 class 定义。
template<class T, int T::*a>
class B
{
T *object_;
public:
B (T* pObj) : object_(pObj) {}
};
但是 如果您可以访问智能指针实现(c++11 或其他),则更愿意存储它而不是原始指针。如果不这样做,则必须遵守 the rule of three (now rule of five in c++11).
此外,如果您进行值初始化而不是复制初始化,您可以大大简化您的生活。
B<A, &A::mem> b(a);
B<A, &A::mem> b(&a);
如何将指针成员传递给模板参数?
很难解释,所以我将显示一个非常短的代码来指出问题。
这是一个有效的代码:-
template<class T, int T::*a> class B{...}
class A{ public: int mem; }
int main(){
A a;
B<A,&A::mem> b= B<A,&A::mem>(a); // I pass "A" as value
}
现在我想传递指针而不是值,如下所示:-
template<class T, int T::*a> class B{...}
class A{ public: int mem; }
int main(){
A* a=new A(); //changed
B<A*,&A*::mem> b= B<A*,&A*::mem>(a); //changed, pass "A*" (#)
}
这是我遇到的编译错误。
prog.cpp:18:13: error: template argument 2 is invalid
B<A*,&A*::mem> b=B<A*,&A*::mem>(a);
^
我在行 (#) 上错了。我应该如何编辑该行?
编辑
这是完整的代码:-
class A{
public: int x=2;
};
template <class T, int T::*a> class B{
T objectA_;
public: B(T objectA){
objectA_ = objectA;
}
public: void print(){
std::cout<< objectA_.*a ;
}
};
int main() {
A objectA; objectA.x=3;
B<A,&A::x> objectB=B<A,&A::x>(objectA); //this line will be changed
objectB.print(); //print 3
return 0;
}
注意 T=A。 现在,我想要 T=A*.
新版本
template <class T, int A::*a> class B{
T objectA_;
public: B(T objectA){
objectA_ = objectA;
}
public: void print(){
std::cout<< objectA_->*a ; //changed
}
};
int main() {
A* objectA = new A(); objectA->x=3; //changed
B<A*,&A*::x> objectB=B<A*,&A*::x>(objectA); //changed
objectB.print();
delete objectA; //new
return 0;
}
B<A, &A::mem>
仍然是正确的形式。您需要更改的是 class 定义。
template<class T, int T::*a>
class B
{
T *object_;
public:
B (T* pObj) : object_(pObj) {}
};
但是 如果您可以访问智能指针实现(c++11 或其他),则更愿意存储它而不是原始指针。如果不这样做,则必须遵守 the rule of three (now rule of five in c++11).
此外,如果您进行值初始化而不是复制初始化,您可以大大简化您的生活。
B<A, &A::mem> b(a);
B<A, &A::mem> b(&a);