有没有办法重载->*
以用于类似智能指针的对象?以下是我想做的事情。为简单起见,我不使用模板(一旦我将它用于单个固定类,我就会得到它)。我可以使用指向数据成员的指针,但我似乎无法正确指向成员函数。目前,我愿意解决一个仅适用于成员函数(而不适用于数据成员)的重载。我甚至愿意接受一个只接受使用单个固定原型(例如void func()
)的成员函数指针的重载。
struct MyObject
{
void MyMethod() {}
};
struct MySmartPtr {
MyObject *p;
// What should the prototype and function body be?
// ??? operator->*(????) { ???? }
};
void MyFunc()
{
MyObject obj;
MySmartPtr obj_ptr;
obj_ptr.p = &obj;
void (MyObject::* member_func_ptr)() = &MyObject::MyMethod;
// Now call obj.MyMethod() through the "smart pointer"
(obj_ptr->*member_func_ptr)();
}
请不要向我提供解决方法(例如,重载*
和(*obj_ptr.*member_func_ptr)()
)。我希望->*
能够按照代码段中的说明工作。
答案 0 :(得分:12)
请看看Scott Meyers的this article。它已经很老了,但是我所知道的唯一讨论重载->*
的资源。
请注意,标准库的迭代器和智能指针类型不会重载->*
。我不知道原因,但我怀疑这是因为操作员很少使用,实现起来很麻烦,而且很容易解决。无论如何,由于标准库不支持它,您的用户也不会期望它也能工作。
答案 1 :(得分:1)
#include <stdio.h>
struct OBJ {
typedef void (OBJ::*Met)(void);
void met( void ) {
printf( "Method call!\n" );
}
};
struct POBJ {
OBJ* p;
typedef void (*fun)(void);
static void nop( void ) {}
fun operator->*( OBJ::Met m ) {
printf( "operator ->* !\n" );
// return fun(p->*m); // works in gcc
(p->*m)();
return nop;
}
};
int main( void ) {
OBJ obj;
OBJ* pobj = &obj;
POBJ p; p.p = &obj;
OBJ::Met met = &OBJ::met;
(pobj->*met)();
(p->*met)();
}
请参阅http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B了解原型
答案 2 :(得分:0)
我会用C ++ 0x给它一个镜头:变量模板,绑定和函数。我想应该可以将它移植到boost:
#include <iostream>
#include <functional>
struct S
{
void f()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template<class C>
struct PMFSmartPtr
{
C *p;
template<typename C1, typename R, typename... P>
std::function<R(P...)> operator->*(R (C1::*pmf)(P...))
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
return(std::function<R(P...)>(std::bind(pmf, p)));
}
};
int main()
{
PMFSmartPtr<S> x;
void (S::*pmf)() = &S::f;
(x->*pmf)();
return(0);
}
尝试使用g ++ 4.4.4,适用于不带任何参数的函数,1参数成员函数编译失败,但我不知道这是我的错误还是编译器或libstdc ++问题......