gpt4 book ai didi

c++ - 为什么 auto_ptr 不支持 op->*()

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

auto_ptr(以及shared_ptr)尽量使它们的使用透明;也就是说,理想情况下,您应该无法区分您使用的是 auto_ptr 还是指向对象的真实指针。考虑:

class MyClass
{
public:
void foo() { }
};

MyClass* p = new MyClass;
auto_ptr<MyClass> ap(new MyClassp);

p->foo(); // No notational difference in using real
ap->foo(); // pointers and auto_ptrs

当你尝试通过一个指向成员的指针来调用一个成员函数时,这是有区别的,因为 auto_ptr 显然没有实现 op->*():

void (MyClass::*memfun)() = &MyClass::foo;

(p->*memfun)(); // OK
(ap->*memfun)(); // Error op->*() missing
(ap.get()->*memfun)(); // OK

为什么 auto_ptr 中不支持 op->*() 以及如何实现它(我已经尝试了一段时间,但最终放弃了)。

最佳答案

正如 Luther 指出的那样,它的实现并非易事 - 但它是可能的。

你必须

  1. 使用模板,以便推导出 operator->* 的参数类型
  2. 使用重载处理可能的限定符和多个函数参数
  3. 对于成员函数指针,返回一个 callabe 对象,即:
    • 绑定(bind)到智能指针指向的实例
    • 实现一个 operator(),其签名等效于成员函数

暂时忽略限定符,这是它的基本外观(使用 C++0x 避免手动重复):

// pointer to data member:

template<class T, class D>
D& operator->*(std::auto_ptr<T>& p, D T::*mp) {
return (*p).*mp;
}

// pointer to member function:

template<class T, class R, class... Args> struct Callable {
typedef R (T::*MFP)(Args...);
MFP mfp;
T& instance;

Callable(T t, MFP mfp) : instance(t), mfp(mfp) {}

R operator()(Args... a) {
return (instance.*mfp)(a...);
}
};

template<class T, class R, class... Args>
Callable<T, R, Args...>
operator->*(std::auto_ptr<T>& p, R (T::*mfp)(Args...)) {
return Callable<T, R, Args...>(*p, mfp);
}

但最后,当我们一开始就可以使用绑定(bind)成员指针的仿函数时,为什么还要麻烦呢。

虽然我不能确定,但​​如果你结合知识,

  • 实现并不简单
  • 有一个同样有效的简单替代方法 ((*p).*m)

...由于所需工作与此功能所带来的 yield 的比例不佳,它可能通常不会实现。

关于c++ - 为什么 auto_ptr 不支持 op->*(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3272522/

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