c++ - ->* 运算符应该在何时何地重载?

标签 c++ operator-overloading

<分区>

我刚接触C++,在学习它的同时,在学习运算符重载的过程中,我了解到我们还可以重载->*,在什么情况下我们需要它?

最佳答案

C++ 运算符重载是一项非常有用且非常强大的功能,但它也很容易被滥用并导致灾难性后果。

经验法则就是遵循不出奇的原则。也就是说,您的运算符重载的语义应该与内置版本的语义相匹配。 (是的,有特定领域语言、boost::spirit 等异常(exception)情况,但这些都是孤立的事情)。

让我们将其应用于->*。通常可以使用指针作为左操作数和指向成员的指针作为右操作数来调用此运算符。因此,你应该只在你想要模拟这种语义的情况下重载它。假设您正在创建一个类似指针的类,可能是一个句柄或一个特殊的智能指针(当 std 中的那些不适用于您的情况时)。然后,您可能希望为您的类重载 ->*,以使其尽可能多地用作常规指针。

例子:

template <typename T>
class LoggingPointer
{
  T *ptr_;
  std::ostream &log_;

public:
  T& operator* () const {
    log_ << "Deref";
    return *ptr_;
  }

  T* operator-> () const {
    log_ << "Access";
    return ptr_;
  }

  template <typename Mem>
  Mem& operator->* (Mem T::*arg) const {
    log_ << "Member access";
    return ptr_->*arg;
  }
};

关于c++ - ->* 运算符应该在何时何地重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15972813/

相关文章:

c++ - 查找最后添加的文件( boost )

c++ - 如何从 pthread 获取 pid

c++ - 如何在 Codelite 中启用 C++11 特性

Python 为自定义类定义 []、len()、items() 和 keys() 运算符

python - 你能为 Python 中的重载运算符施加对象优先级吗?

c++ - CImg 库中的奇怪语法,不知道它叫什么

c++ - ram 中的共享内存或命名管道?

c++ - 为什么 `(void *)&` 会得到变量的地址?

C++ 重载运算符 []

c++ - 具有继承和虚拟基类的赋值运算符