2012-01-06 46 views
1

請考慮這個例子, 我們如何強制隱式轉換函數的第二個參數是指向成員函數的指針。 明確地在函數的參數列表中進行投射並不是我現在想要的功能。 相反,我會喜歡的編譯器在某種程度上是這樣做它與第一個參數呢?如何強制多態中的隱式轉換?

struct Base 
{ 
    virtual ~Base() = 0 {} 
}; 

struct Derived : public Base 
{ 
    void f(){} 
}; 

typedef void(Base::*polymorph)(); 

// how do I force IMPLICIT conversion here: EDIT: (polymorph type work only for polymorph pointer type no conversion) 
void func(Base* arg1, polymorph arg2) // void* arg2, (void*) arg2 etc... dosn't work 
{ 
    polymorph temp = reinterpret_cast<polymorph>(arg2); // to achive this 
} 

int main() 
{ 
    Derived* test = new Derived; 
    // first parameter work but another gives an error 
    func(test, &Derived::f); // BY NOT CHANGING THIS! 
    delete test; 
    return 0; 
} 
+1

我懷疑這是不能做到的。在func中,你知道(靜態)你正在處理一個Base對象,並假裝任何Base對象都有該方法是不安全的。 - 另外,僅僅因爲有指針參與,並不意味着你必須使用'new/delete':'派生測試; func(&test,&Derived :: f);' – visitor 2012-01-06 11:22:38

+0

這個問題還不夠清楚。請解釋一下。 – 2012-01-06 11:56:14

+0

我希望能夠通過一個指向成員方法的指針,該指針用於指向成員參數的函數參數。在我的例子中,函數應該採用「polimorph」類型,但不會。 – codekiddy 2012-01-06 13:09:59

回答

2

乾淨,因爲它得到。下面的代碼。但是當「temp」實際被調用時,我不知道誰是「this」指針會被引用。

typedef void(Base::*polymorph)(); 

void func(Base* arg1, polymorph arg2) 
{ 
    polymorph temp = arg2; 
} 


int main() 
{ 
    Derived* test = new Derived; 
    // first parameter work but another gives an error 
    func(test, static_cast<polymorph>(&Derived::f)); 
    delete test; 
    return 0; 
} 
+0

感謝您的努力selbie,但第二個參數正在使用static_cast顯式轉換,但不是按照我的意圖隱式轉換。我想在沒有鑄造操作員的情況下在main函數中做這個。相反,鑄造操作員應該使用一些其他的。但這不可能不是嗎? – codekiddy 2012-01-10 13:07:53

+0

@codekiddy - 出於同樣的原因,您不能隱式地將指向基類的指針轉換爲指向派生類的指針。除此之外,如何通過「temp」調用Derived :: f可能是安全的?什麼對象要調用temp,它的類型是什麼?如果答案是「基地的一個實例」,那麼假設類型安全就是一個很大的飛躍。讓我問一下:「你究竟想幹什麼?」如果我的團隊中的某個人試圖通過指向成員函數的方法搞砸了某些東西,我們可能會將更好的設計與界面和虛擬方法結合在一起。 – selbie 2012-01-10 19:40:32

+0

我曾經試過的東西不會因爲我放棄而變得更加美麗。謝謝你的時間! – codekiddy 2012-01-10 19:54:56