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

如何调用结构体中的()运算符?

如何调用结构体中的()运算符?

嘿,这事儿我门儿清,给你唠唠怎么调用结构体里的()运算符哈!

首先得说在前头:要调用这个()运算符,前提是你已经给结构体重载了()运算符哦,不然根本没这个东西可调用。先整个简单的例子结构体,你一看就懂:

struct CalcStruct {
    // 重载()运算符,接收两个int,返回它们的乘积
    int operator()(int num1, int num2) {
        return num1 * num2;
    }
};

接下来分几种常见情况说调用方式:

  • 用结构体的普通对象调用:
    先创建一个结构体实例,然后直接像调用普通函数那样,用对象名(参数)的形式就行,超简单:

    CalcStruct calcObj;
    int res = calcObj(4, 5); // 这里就调用了重载的()运算符,res就是20
    
  • 用指向结构体对象的指针调用:
    要是你手里拿的是结构体对象的指针,那有两种正确写法:
    一种是先把指针解引用成对象,再调用;另一种是直接用->operator()的形式调用,比如:

    CalcStruct* calcPtr = new CalcStruct();
    // 写法一:解引用后调用
    int res1 = (*calcPtr)(3, 6);
    // 写法二:直接调用operator()方法
    int res2 = calcPtr->operator()(3, 6);
    

    别写成calcPtr->(3,6)啊,这写法编译器不认的,踩过坑的人提醒你!

  • 如果是静态的()运算符(很少见但提一嘴):
    要是结构体里的()运算符被定义成静态的,那直接用结构体名调用就行,比如:

    struct StaticCalc {
        static int operator()(int a, int b) {
            return a + b;
        }
    };
    // 两种调用方式都可以
    int res3 = StaticCalc::operator()(10, 20);
    int res4 = StaticCalc()(10, 20);
    

对了,你之前给的那个Node类的代码虽然截断了,但要是给这个类加上()运算符重载,调用逻辑也是一模一样的。比如给Node加个打印节点信息的重载:

class Node {
public:
    Eigen::VectorXd q;
    std::shared_ptr<Node> parent;
    std::unordered_map<std::shared_ptr<Node>, double> neighbors;

    Node(const Eigen::VectorXd& q, std::shared_ptr<Node> parent = nullptr) {
        this->q = q;
        this->parent = parent;
    }

    // 重载()运算符,打印q的维度
    void operator()() {
        std::cout << "当前节点的q维度是:" << q.size() << std::endl;
    }
};

调用的时候就这么写:

Eigen::VectorXd myQ(5);
Node myNode(myQ);
myNode(); // 直接调用无参的()运算符,就能打印维度啦

备注:内容来源于stack exchange,提问作者raaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:29:40