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

时间:2018-02-07 13:20:08

标签: c++ pointers operator-overloading operators smart-pointers

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

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

在他的文章"Implementing operator->* for Smart Pointers"中,Scott Meyers只是简单地触及 智能 指向成员的指针,因为那时(1999)对于 原始 指向成员的指针,特定问题非常困难(旁注:后者通过lambdas here优雅地解决)。< / p>

无论如何,斯科特迈耶斯写了一个脚注:

  

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

我试图找到一个这样一个自然智能指针指向成员的示例。 但我自己既没有想出任何东西,也没有在线搜索发现我想要的东西。

你知道任何现实世界&#34;指向会员的智能指针&#34;示例

修改: 我没有寻找任何->*重载(正如一些EDSL所做的那样)。 针对具有类似于内置->*的语义的示例,我上面的定义明确要求lhs原始指针

1 个答案:

答案 0 :(得分: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; } );

我们可以和他们一起玩。

do_layout( data, x, y );

VS

do_layout( data, y, x );

水平或垂直解决问题。

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

右手普通成员指针有一个问题,我们必须传递一整套成员指针,每个类型一个在左侧工作。

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