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

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-> *()的支持,并且它将如何实现它(我已经尝试了一段时间,但最终放弃了)。

正如路德指出的那样,它是不可执行的 – 但这是可能的。

你必须

>使用模板,因此可以推导出对operator-> *的参数的类型
>使用重载来处理可能的限定符和多个功能
>对于成员函数指针返回一个callabe对象:

>绑定到智能指针指向的实例
>实现一个具有等效于成员函数的签名的operator()

忽略momement的限定符,这里是如何基本上看(使用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);
}

但是最后,为什么我们只能使用绑定成员指针的函子呢?

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

>实现是不平凡的
>有一个简单的选择也可以((* p))* m)

…它可能通常没有实现,因为这个功能产生的收益所需的工作的比例不好。

http://stackoverflow.com/questions/3272522/why-doesnt-auto-ptr-support-op

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 为什么auto_ptr不支持op – > *()