我有自己的智能指针实现,现在我试图解决通过其指针调用成员函数的问题。我没有提供任何类似于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/