我有自己的智能指针实现,现在我试图解决通过其指针调用成员函数的问题。我没有提供任何类似于get()的函数(实际上,我提供了一个operator->,但我不想为此目的使用它)。

我的问题是:operator->*的签名和返回类型应该是什么样?

最佳答案

为了完整起见,这是一个完整的,可编译的最小示例,受此paper I've linked to的启发很深,并精简了一个小用法演示,以帮助您入门:

#include <memory>
#include <iostream>
#include <utility>


// Our example class on which we'll be calling our member function pointer (MFP)
struct Foo {
    int bar() {
        return 1337;
    }
};

// Return value of operator->* that represents a pending member function call
template<typename C, typename MFP>
struct PMFC {
    const std::unique_ptr<C> &ptr;
    MFP pmf;
    PMFC(const std::unique_ptr<C> &pPtr, MFP pPmf) : ptr(pPtr), pmf(pPmf) {}

    // the 'decltype' expression evaluates to the return type of ((C*)->*)pmf
    decltype((std::declval<C &>().*pmf)()) operator()() {
        return (ptr.get()->*pmf)();
    }
};

// The actual operator definition is now trivial
template<typename C, typename MFP>
PMFC<C, MFP> operator->*(const std::unique_ptr<C> &ptr, MFP pmf)
{
    return PMFC<C, MFP>(ptr, pmf);
}

// And here's how you use it
int main()
{
    std::unique_ptr<Foo> pObj(new Foo);
    auto (Foo::*pFn)() = &Foo::bar;
    std::cout << (pObj->*pFn)() << std::endl;
}

关于c++ - C++中的重载运算符-> *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27634036/

10-12 21:34