Tob*_*obi 14 c++ pointers smart-pointers operator-overloading operators
澄清英语中可能的优先歧义:我们正在采取"智能(指向成员的指针)",而不是"(智能指针)成员".
我会将一个指向成员的智能指针定义为带有operator ->* (T* lhs, X rhs)重载的类X.
在他的文章"实现操作符 - >*用于智能指针"中,Scott Meyers只是简单地触及指向成员的智能指针,因为当时(1999)特定问题对于成员的原始指针来说已经足够困难了(旁注:后者优雅地解决了)这里有lambdas ).
无论如何,Scott Meyers写了一个脚注:
在撰写本文草稿后不久,我的一位咨询客户向我展示了一个问题,这个问题通过智能指向成员的方式自然而然地解决了.我也很惊讶.
我试图找到一个这样一个成员的自然智能指针的例子.但是我既不能自己想出任何东西,也没有在线搜索发现我在寻找什么.
你知道任何现实世界"成员智能指针"的例子吗?
编辑:我不是在寻找任何->*过载(如某些EDSL所做的那样).针对具有类似内置语义的语义示例->*,我上面的定义明确要求lhs是一个原始指针.
您有一个应该支持 90 度旋转(高度和宽度交换)的布局引擎。
使用智能成员指针,您可以创建(foo->*x)和(foo->*y)交换含义。同样智能x,y可以处理不同的不相关类型的数据(矩形、点、向量),甚至可以处理您不拥有的类型。
template<class F>
struct smart_pm_t {
F f;
template<class T>
friend decltype(auto) operator->*(T* t, smart_pm_t const& self ) {
return self.f(t);
}
};
template<class F>
smart_pm_t<F> smart_pm( F f ) { return {std::move(f)}; }
auto x = smart_pm( [](auto* t)->decltype(auto) noexcept { return t->x; } );
auto y = smart_pm( [](auto* t)->decltype(auto) noexcept { return t->y; } );
Run Code Online (Sandbox Code Playgroud)
我们可以对它们更加感兴趣。
do_layout( data, x, y );
Run Code Online (Sandbox Code Playgroud)
与
do_layout( data, y, x );
Run Code Online (Sandbox Code Playgroud)
水平或垂直解决问题。
这是实际生产代码中的一个实际(简化)用例,它减少了代码重复并消除了一大堆错误,因为我们只需修复代码一次。
右手普通成员指针存在这样的问题:我们必须传递一整套成员指针,每个类型在左手边工作一个。
实际上,我们编写了一个编译时多态成员指针。
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |