什么是"智能指向成员"的真实示例?

Tob*_*obi 14 c++ pointers smart-pointers operator-overloading operators

澄清英语中可能的优先歧义:我们正在采取"智能(指向成员的指针)",而不是"(智能指针)成员".

我会将一个指向成员智能指针定义为带有operator ->* (T* lhs, X rhs)重载的类X.

在他的文章"实现操作符 - >*用于智能指针"中,Scott Meyers只是简单地触及指向成员的智能指针,因为当时(1999)特定问题对于成员的原始指针来说已经足够困难了(旁注:后者优雅地解决了)这里有lambdas ).

无论如何,Scott Meyers写了一个脚注:

在撰写本文草稿后不久,我的一位咨询客户向我展示了一个问题,这个问题通过智能指向成员的方式自然而然地解决了.我也很惊讶.

我试图找到一个这样一个成员的自然智能指针的例子.但是我既不能自己想出任何东西,也没有在线搜索发现我在寻找什么.

你知道任何现实世界"成员智能指针"的例子吗?

编辑:我不是在寻找任何->*过载(如某些EDSL所做的那样).针对具有类似内置语义的语义示例->*,我上面的定义明确要求lhs是一个原始指针.

Yak*_*ont 1

您有一个应该支持 90 度旋转(高度和宽度交换)的布局引擎。

使用智能成员指针,您可以创建(foo->*x)(foo->*y)交换含义。同样智能xy可以处理不同的不相关类型的数据(矩形、点、向量),甚至可以处理您不拥有的类型。

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)

水平或垂直解决问题。

这是实际生产代码中的一个实际(简化)用例,它减少了代码重复并消除了一大堆错误,因为我们只需修复代码一次。

右手普通成员指针存在这样的问题:我们必须传递一整套成员指针,每个类型在左手边工作一个。

实际上,我们编写了一个编译时多态成员指针。