簡體   English   中英

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

[英]How to overload operator ->* in C++

有沒有辦法重載->*用於類似智能指針的對象? 以下是我想做的事情。 為簡單起見,我不使用模板(一旦我將它用於單個固定類,我就會得到它)。 我可以使用指向數據成員的指針,但我似乎無法正確指向成員函數。 目前,我願意解決一個僅適用於成員函數(而不適用於數據成員)的重載。 我甚至願意接受一個只接受指向成員函數指針的重載,只有一個固定的原型(比如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)();
}

請不要給我解決方法(例如,重載*和do (*obj_ptr.*member_func_ptr)() )。 我想->*按照代碼段中的說明工作。

看看Scott Meyers 撰寫的這篇文章 它已經很老了,但是唯一討論重載的資源->*我知道的。

請注意,標准庫的迭代器和智能指針類型不會重載->* 我不知道原因,但我懷疑這是因為操作員很少使用,實現起來很麻煩,而且很容易解決。 無論如何,由於標准庫不支持它,您的用戶也不會期望它也能工作。

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

我將用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 ++問題...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM