2013-08-02 44 views
2

例如,如果我想通過如何將類的重載操作符成員作爲函數指針傳遞?

ostream& std::ostream::operator << (int i); 

到作爲

void func(ostream& (*out)(int), ...); 

那麼我將如何去這樣做,這樣的功能呢?

func(std::ostream::operator << (int)) 

肯定不工作,

typedef ostream& (*out)(int); 
out o = std::ostream::operator << (int); 
func(o); 

試圖分配:○當拋出一個編譯時錯誤。那麼如何指出重載操作符? (鑄造鍵入了不在這種情況下工作,要麼)


的代碼打轉轉後,我現在的問題是這樣的:那爲什麼非成員,重載運算符,即

ostream& operator << (ostream&, classX) 

返回一個void *而不是指向函數的指針?

如果我做

typedef ostream& (*out)(ostream&,classX); 

我只能讓它

void* v = ostream& operator << (ostream&,classX); 

,而不是

out o = ostream& operator << (ostream&,classX); 

它打印錯誤訊息

190: error: invalid conversion from 'void*' to 'std::ostream& (*)(std::ostream&, classX)' 
+0

這裏的問題不是你試圖給函數指針指定一個非靜態成員函數嗎? –

+0

是的。但爲什麼這會阻止指向非靜態成員函數?是否因爲所有非靜態成員都是實例化依賴的? – Ali

+0

您能提供編譯器錯誤消息嗎? – Manu343726

回答

2

取決於您是如何超載操作員。

的函數(即指向型指針)的簽名是:

  • RETURN_TYPE(*)(PARAMETERS_TYPES)如果它的全局函數。
  • RETURN_TYPE (CLASS_NAME::*)(PARAMETERS_TYPES)如果它是一個成員函數。

如果你有一個叫f功能和獲得一個指向函數作爲參數的函數,f爲通過如下:

  • g(f)如果f是一個全球性的功能。
  • g(&CLASS_NAME::f)如果f是CLASS_NAME類的成員函數。

請注意,函數指針和成員函數指針是不兼容的。

因此,如果您的運營商作爲成員功能超載,如operator+=您應該使用第二個版本。如果沒有,你應該使用第一個。

+0

但是如果你定義了rtype運算符+ =(type1,type2),它不會是一個成員函數,因此與第一個sig兼容,對吧? – Ali

0

我會簡化這裏的任務。無需指定整個簽名,因爲可以從左側的類型推斷正確的過載。

#include <iostream> 
using namespace std; 

struct Foo 
{ 
    int x; 
}; 

ostream& operator<< (ostream &a, const Foo& b) 
{ 
    return a << b.x; 
} 

typedef ostream& (*Func) (ostream &, const Foo&); 

int main() { 
    Func func = &operator<<; 
    (*func)(cout, Foo{42}); 
} 
相關問題