类似指针的类和 ->* 运算符
Pointer-like classes and the ->* operator
我最近遇到需要将指向成员的指针应用到迭代器指定的对象。我尝试过自然语法:
ite->*ptr = 42;
令我沮丧的是,它没有编译。迭代器不会重载operator->*
,但更令人惊讶的是,智能指针也不会重载。我需要求助于以下笨拙的手段:
(*ite).*ptr = 42;
实验(见下面的实际例子(表明,至少从C++14开始,对于自定义类,对于指向成员的指针和指向成员函数的指针,这样的语法似乎是可以实现的。
因此:
- 标准的类指针类不重载
operator->*
是有原因的,还是只是疏忽 - 在定义自己的类似指针的类时,我应该重载
operator->*
吗?还是同样的原因也适用于我
实例——什么编译,什么不编译,以及自定义类的概念验证。
您可以用一个自由函数重载->*
。它不一定是成员。
template <typename P,
typename T,
typename M>
M& operator->* (P smartptr, M T::*ptrmem)
{
return (*smartptr).*ptrmem;
}
现在,所有定义了一元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)...); };
}
这就是((&*ite)->*ptr) = 42;
想要做的吗?
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 是否需要使用 - &gt;运算符在C 中调用成员函数时