gpt4 book ai didi

c++ - 将成员名称作为模板参数传递,由 T 的指针引用

转载 作者:行者123 更新时间:2023-11-28 05:38:28 25 4
gpt4 key购买 nike

如何将指针的成员传递给模板参数?

这很难解释,所以我将展示一个非常短的代码来指出问题。

这是一个有效的代码:-

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>仍然是正确的形式。您需要更改的是类定义。

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);

关于c++ - 将成员名称作为模板参数传递,由 T 的指针引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37696720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com