我最近遇到了将指针指向成员应用于迭代器指定的对象的需要。我尝试过自然语法:
ite->*ptr = 42;
令我沮丧的是,它没有编译。迭代器不会超载operator->*
,但更令人惊讶的是智能指针也不会。我需要诉诸以下狡猾:
(*ite).*ptr = 42;
试验(参见下面的实例)已经表明,对于自定义类,对于指向成员的指针和指向成员函数的指针,这样的语法似乎是可以实现的,至少从C ++ 14开始。< / p>
因此:
operator->*
,还是只是一个疏忽?operator->*
,还是同样的理由适用于我?Live example - 编译什么,什么没编辑,以及自定义类的概念验证。
答案 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;
吗?