我是 C++ 新手,正在学习它,在学习运算符重载的同时,我知道我们也可以重载 ->*
,在什么情况下我们需要它?
3 回答
C++ 运算符重载是一项有用且非常强大的功能,但它也很容易被误用并导致灾难性后果。
经验法则是遵循毫不意外的原则。也就是说,您的运算符重载的语义应该与内置版本的语义相匹配。(是的,有一些例外,例如特定领域的语言、boost::spirit 等,但这些都是孤立的事务)。
让我们将此应用于->*
. 通常可以使用指针作为左操作数和指向成员的指针作为右操作数来调用此运算符。因此,您应该只在您想要模拟此类语义的情况下重载它。假设您正在创建一个类似指针的类,可能是一个句柄或一个特殊的智能指针(当其中的那些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;
}
};
我们使用运算符的一个地方->*
是我们在操作方法指针时。
由于方法必须知道在哪个对象中调用了她,我们可以这样做:
class A
{
public:
int some_integer;
void add_then_print(int value)
{
this->some_integer = this->some_integer + value;
std::cout << "My integer now: " << this->some_integer;
}
};
typedef void (A::*method_pointer)(int);
int main(void)
{
A* my_first_class_a = new A;
A* my_second_class_a = new A;
method_pointer method = &A::add_then_print;
(my_first_class_a->*(method))(10);
(my_second_class_a->*(method))(12);
return 0;
}
在这种情况下,您可以看到该add_then_print
方法已保存到method
.
但是为了知道this
中代表什么add_then_print
,当我们使用方法指针调用方法时,语法是这样的:
(object->*(method_pointer))(parameters_to_the_method);
在某些情况下,您可能希望重载此运算符以执行其他操作,而不是仅使用给定参数或您想要的任何参数调用它。
这可能不是您正在寻找的答案,但您需要它的唯一情况是让项目中的其他人感到困惑。这包括你在路上的两周。所以请不要。并非所有可能做的事情都是实际实施的好主意。