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