如何在C ++中重载operator - > *

时间:2011-03-22 09:39:02

标签: c++ operator-overloading smart-pointers

有没有办法重载->*以用于类似智能指针的对象?以下是我想做的事情。为简单起见,我不使用模板(一旦我将它用于单个固定类,我就会得到它)。我可以使用指向数据成员的指针,但我似乎无法正确指向成员函数。目前,我愿意解决一个仅适用于成员函数(而不适用于数据成员)的重载。我甚至愿意接受一个只接受使用单个固定原型(例如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)())。我希望->*能够按照代码段中的说明工作。

3 个答案:

答案 0 :(得分:12)

请看看Scott Meyers的this article。它已经很老了,但是我所知道的唯一讨论重载->*的资源。

请注意,标准库的迭代器和智能指针类型不会重载->*。我不知道原因,但我怀疑这是因为操作员很少使用,实现起来很麻烦,而且很容易解决。无论如何,由于标准库不支持它,您的用户也不会期望它也能工作。

答案 1 :(得分:1)

http://codepad.org/yl3Ghwab

#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 ++问题......