【发布时间】:2015-08-06 09:29:54
【问题描述】:
我最近遇到了需要将指向成员的指针应用于由迭代器指定的对象。我已经尝试过自然语法:
ite->*ptr = 42;
令我沮丧的是,它没有编译。迭代器不会重载operator->*,但更令人惊讶的是,智能指针也不会。我需要求助于以下笨拙:
(*ite).*ptr = 42;
实验(请参阅下面的实时示例)表明,对于指向成员的指针和指向成员函数的指针,这种语法似乎对于自定义类是可以实现的,至少从 C++14 开始。
因此:
- 标准类指针类不会重载
operator->*是否有原因,还是只是疏忽? - 在定义自己的类指针类时,我应该重载
operator->*,还是同样的原因也适用于我?
Live example -- 什么可以编译,什么不可以,以及自定义类的概念验证。
【问题讨论】:
-
@Galik 我的意思是指向成员的指针,而不是普通成员。看看here.
-
见stackoverflow.com/questions/14106975/… 那里提出了一些好的观点
-
另见stackoverflow.com/questions/17696664/…——虽然这更多是关于指向成员函数的指针而不是指向数据成员的指针。
-
@Hcorg 非常感谢你,这很有启发性——成员函数确实很痛苦。但是它们在 C++14 中看起来不错(我更新了示例)。
-
@ecatmur 它确实带来了一些我没有意识到的真正有趣的东西:可以将
operator->*定义为非成员。除非这样的运算符是一个糟糕的主意,否则它可以“热补丁”到标准类上。很好,谢谢!
标签: c++ iterator operator-overloading c++14 smart-pointers