c++ - 函数调用的重载运算符

标签 c++ operator-overloading overloading

是否可以只为一个函数重载运算符。我想覆盖 '->' 运算符,但仅当使用打印函数 ( ->print() ) 调用它时。我知道这是一个奇怪的请求,但我正在努力实现某个 API,我需要这样的东西。

例如:

Cat cat;
cat.walk();
cat->print(); //I want to overload only this call

但是,我不想在所有情况下都重载“->”运算符。例如:

Cat* cat;
cat->walk(); //this should work normally
cat->print(); //this wouldn't call the print() function, 
              //since I overloaded cat->print()

最佳答案

您可以使用虚拟返回对象重载 -> 运算符。真正的 print() 方法可以设为私有(private)并且只能通过访问器访问。在一个最小的例子中:

#include <iostream>

struct Cat;

struct CatAccessor {
private:
    friend class Cat;
    CatAccessor(Cat& cat) : cat(cat) {}
    Cat& cat;
public:
    void print();
    CatAccessor* operator->() { return this; }
};

struct Cat {
    CatAccessor* operator->() { return CatAccessor(*this); }
    void walk() { std::cerr << "Walk called" << std::endl; }
private:
    void print() { std::cerr << "Print called" << std::endl; }
    friend class CatAccessor;
};

void CatAccessor::print() { cat.print(); }

int main() {
    Cat cat;
    cat.walk();
    cat->print();
    Cat* catp = &cat;
    catp->walk();
    // error: catp->print();
    return 0;
}

关于c++ - 函数调用的重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15346634/

相关文章:

c++ - PC Lint 并检查可能的 nullptr

c++ - OpenMP 临界区带来意想不到的性能提升

c++ - 一遍又一遍地验证文件时遇到问题

c++ - 如何正确返回带有成员变量的重载运算符++?

c++ - 右值参数无法在函数重载中解析

c# - 使用 P/Invoke 编码双参数

c# - C#中作为静态多态的方法重载

c++ - 为什么在对象的重载运算符 = 中需要返回?

c++ - 这与函数重载有什么关系?

Python - 迭代完成后变量会恢复到原始值