Que*_*tin 14 c++ iterator smart-pointers operator-overloading c++14
我最近遇到了将指针指向成员应用于迭代器指定的对象的需要.我尝试过自然语法:
ite->*ptr = 42;
Run Code Online (Sandbox Code Playgroud)
令我沮丧的是,它没有编译.迭代器不会过载operator->*,但更令人惊讶的是智能指针也不会.我需要诉诸以下笨拙:
(*ite).*ptr = 42;
Run Code Online (Sandbox Code Playgroud)
试验(参见下面的实例)已经表明,对于自定义类,对于指向成员的指针和指向成员函数的指针,这样的语法似乎是可以实现的,至少从C++ 14开始.
因此:
operator->*,还是仅仅是一种疏忽?operator->*在定义类似指针的类时,我应该重载,还是同样的理由适用于我?实例 - 什么是编译,什么不编译,以及自定义类的概念验证.
您可以->*使用免费功能进行重载.它不一定是会员.
template <typename P,
typename T,
typename M>
M& operator->* (P smartptr, M T::*ptrmem)
{
return (*smartptr).*ptrmem;
}
Run Code Online (Sandbox Code Playgroud)
现在,所有具有一元operator*定义(迭代器,智能指针等)的东西也可以使用->*.您可能希望以更加受控制的方式执行此操作,即分别为已知迭代器,已知智能指针等定义它.
由于显而易见的原因,这对成员函数不起作用.对于这种情况,需要专门化/重载并返回绑定std::function:
template <typename P,
typename T,
typename M,
typename ... Arg>
std::function<M(Arg&&...)>
operator->* (P smartptr, M (T::*ptrmem)(Arg... args))
{
return [smartptr,ptrmem](Arg&&... args) -> M
{ return ((*smartptr).*ptrmem)(std::forward<Arg>(args)...); };
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |