类指针类和 - > *运算符

时间:2015-08-06 09:29:55

标签: c++ iterator operator-overloading c++14 smart-pointers

我最近遇到了将指针指向成员应用于迭代器指定的对象的需要。我尝试过自然语法:

ite->*ptr = 42;

令我沮丧的是,它没有编译。迭代器不会超载operator->*,但更令人惊讶的是智能指针也不会。我需要诉诸以下狡猾:

(*ite).*ptr = 42;

试验(参见下面的实例)已经表明,对于自定义类,对于指向成员的指针和指向成员函数的指针,这样的语法似乎是可以实现的,至少从C ++ 14开始。< / p>

因此:

  • 是否有一个原因,标准类指针类不会超载operator->*,还是只是一个疏忽?
  • 在定义类似指针的类时,我应该重载operator->*,还是同样的理由适用于我?

Live example - 编译什么,什么没编辑,以及自定义类的概念验证。

2 个答案:

答案 0 :(得分:5)

您可以使用免费功能重载return Observable.timer(2, TimeUnit.SECONDS) .flatMap(integer -> captureList.getLatestCaptureCut()) .flatMap(vp::processVideo) .observeOn(AndroidSchedulers.mainThread()) .repeat() 。它不一定是会员。

->*

现在所有具有一元template <typename P, typename T, typename M> M& operator->* (P smartptr, M T::*ptrmem) { return (*smartptr).*ptrmem; } 定义的内容(迭代器,智能指针等等)也可以使用operator*。您可能希望以更加可控的方式执行此操作,即分别为已知迭代器,已知智能指针等定义它。

由于显而易见的原因,这对成员函数不起作用。对于这种情况,需要专门化/重载并返回绑定的->*

std::function

答案 1 :(得分:0)

这就是你想要做的事情((&*ite)->*ptr) = 42;吗?