gpt4 book ai didi

c++ - 类指针类和 ->* 运算符

转载 作者:IT老高 更新时间:2023-10-28 22:41:28 25 4
gpt4 key购买 nike

我最近遇到了需要将指向成员的指针应用于由迭代器指定的对象。我已经尝试过自然语法:

ite->*ptr = 42;

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

(*ite).*ptr = 42;

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

因此:

  • 标准类指针类不重载 operator->* 是否有原因,还是只是疏忽?
  • 我应该在定义自己的类指针类时重载 operator->*,还是同样的原因也适用于我?

Live example -- 什么可以编译,什么不能编译,以及自定义类的概念验证。

最佳答案

您可以使用自由函数重载 ->*。它不必是成员。

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

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

由于显而易见的原因,这不适用于成员函数。对于这种情况,需要专门化/重载并返回绑定(bind)的 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)...); };
}

关于c++ - 类指针类和 ->* 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31851987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com