You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:40:32