类似指针的 类 和 ->* 运算符

Pointer-like classes and the ->* operator

我最近发现需要将指向成员的指针应用于迭代器指定的对象。我试过自然语法:

ite->*ptr = 42;

令我沮丧的是,它没有编译。迭代器不会重载 operator->*,但更令人惊讶的是智能指针也不会。我需要求助于以下笨拙的方法:

(*ite).*ptr = 42;

实验(参见下面的实际示例)表明,对于自定义 classes,至少对于成员指针和成员函数指针来说,这样的语法似乎是可以实现的从 C++14 开始。

因此:

Live example -- 什么编译,什么不编译,以及自定义 class.

的概念验证

这是你想要做的吗((&*ite)->*ptr) = 42;

您可以使用自由函数重载 ->*。不一定是会员。

template <typename P,
          typename T,
          typename M>
M& operator->* (P smartptr, M T::*ptrmem)
{
    return (*smartptr).*ptrmem;
}

现在所有定义了一元 operator* 的东西(迭代器、智能指针等)也可以使用 ->*。您可能希望以更可控的方式进行,即分别为已知的迭代器、已知的智能指针等定义它。

由于显而易见的原因,这不适用于成员函数。对于这种情况,需要 specialize/overload 而 return 绑定 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)...); };
}