澄清英语中可能存在的优先歧义:我们正在采取" smart(指向成员的指针)"而不是"(智能指针)成员"。
我会将一个智能指针指向成员,并将其作为一个重载operator ->* (T* lhs, X rhs)
的类X.
在他的文章"Implementing operator->* for Smart Pointers"中,Scott Meyers只是简单地触及 智能 指向成员的指针,因为那时(1999)对于 原始 指向成员的指针,特定问题非常困难(旁注:后者通过lambdas here优雅地解决)。< / p>
无论如何,斯科特迈耶斯写了一个脚注:
撰写本文草稿后不久,我的一个咨询 客户向我展示了一个问题,这个问题通过智能指针成员自然解决。我也很惊讶。
我试图找到一个这样一个自然智能指针指向成员的示例。 但我自己既没有想出任何东西,也没有在线搜索发现我想要的东西。
你知道任何现实世界&#34;指向会员的智能指针&#34;示例
修改:
我没有寻找任何->*
重载(正如一些EDSL所做的那样)。
针对具有类似于内置->*
的语义的示例,我上面的定义明确要求lhs
是原始指针。
答案 0 :(得分:1)
你有一个布局引擎,可以旋转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; } );
我们可以和他们一起玩。
do_layout( data, x, y );
VS
do_layout( data, y, x );
水平或垂直解决问题。
这是实际生产代码中的一个实际(简化)用例,它减少了代码重复并解决了一大堆错误,因为我们只需要修复一次代码。
右手普通成员指针有一个问题,我们必须传递一整套成员指针,每个类型一个在左侧工作。
实际上,我们编写了一个编译时多态成员指针。