如何在C++中用成员指针实现类似Python __getattribute__的通用成员操作?
在C++中用成员指针实现类似Python __getattribute__的通用成员操作
你要的功能完全可以通过成员指针实现,这是C++中专门用来指向类成员的语法,刚好能解决你避免重复代码、提升扩展性的需求。
修改后的示例类实现
class C{ public: C* linked1; C* linked2; double d1; double d2; C(double d1, double d2) : d1{d1}, d2{d2} {}; // 参数为指向C类double成员的指针 double add(double C::* mem_ptr){ return (linked1->*mem_ptr) + (linked2->*mem_ptr) + (this->*mem_ptr); } };
调用方式
C c1{1., 2.}; C c2{3., 4.}; C c3{5., 6.}; c1.linked1 = &c2; c1.linked2 = &c3; // 直接传递成员指针指定要操作的属性 double a1 = c1.add(&C::d1); // 结果:1. + 3. + 5. = 9.0 double a2 = c1.add(&C::d2); // 结果:2. + 4. + 6. = 12.0
核心语法说明
double C::* mem_ptr:声明一个指向C类中double类型成员的指针变量->*:用于通过对象指针访问成员指针指向的成员(比如linked1->*mem_ptr就是取linked1对象的对应成员值).*:用于通过对象实例访问成员指针指向的成员(比如this->*mem_ptr等价于(*this).*mem_ptr)
扩展到实际Node类场景
针对你提到的Node类(包含温度、压力等属性,关联相邻节点),可以用同样的思路实现通用插值方法:
class Node{ public: Node* left; Node* right; double temperature; double pressure; Node(double temp, double press) : temperature(temp), pressure(press) {} // 通用插值计算方法,支持任意double类型属性 double interpolate(double Node::* attr){ // 这里替换为你的插值逻辑,比如线性插值示例 return 0.25*(left->*attr) + 0.5*(this->*attr) + 0.25*(right->*attr); } };
调用时只需传入对应属性的成员指针:
Node n1{20.0, 101325}; Node n2{25.0, 101200}; Node n3{30.0, 101000}; n2.left = &n1; n2.right = &n3; double temp_interp = n2.interpolate(&Node::temperature); double press_interp = n2.interpolate(&Node::pressure);
这种方式不需要为每个属性单独写重复的插值方法,后续新增属性时,只要在Node类中添加成员变量,直接复用interpolate方法即可,完全满足扩展性需求。
内容的提问来源于stack exchange,提问作者GorillazOnPlane
相关产品推荐
相关产品推荐

