如何调用结构体中的()运算符?
如何调用结构体中的()运算符?
嘿,这事儿我门儿清,给你唠唠怎么调用结构体里的()运算符哈!
首先得说在前头:要调用这个()运算符,前提是你已经给结构体重载了()运算符哦,不然根本没这个东西可调用。先整个简单的例子结构体,你一看就懂:
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
相关产品推荐
相关产品推荐

