2012-09-18 77 views
1

目前我有這一個排序功能:reinterpret_cast < type-id >的「type-id」是否是一個變量?

bool operator()(CVParent* lhs, CVParent* rhs) 
{ 
    double dFirstValue = reinterpret_cast< CVChild * >(lhs)->GetValue(m_lFeature); 
    double dSecondValue = reinterpret_cast< CVChild * >(rhs)->GetValue(m_lFeature); 
    .... 
} 

眼下型-ID被硬編碼爲CVChild *,但它可以是一個參數?我不想爲CVParent的每個派生類寫一個函數。

編輯:基於羅斯特的建議 我做了更改:

class Compare_Functor 
{ 
public: 

    Compare_Functor(const long& lFeature, const bool& bIsAscending) 
    { 
     m_lFeature = lFeature; 
     m_bIsAscending = bIsAscending; 
    } 

    template <class T> 
    bool operator()(CVParent* lhs, CVParent* rhs) 
    { 
     double dFirstValue = reinterpret_cast< T * >(lhs)->GetValue(m_lFeature); 
     double dSecondValue = reinterpret_cast< T * >(rhs)->GetValue(m_lFeature); 
     .... 
    } 

private: 

    long m_lFeature; 
    bool m_bIsAscending; 
} 

當前使用情況(怎麼辦修訂了STL排序函數調用): 的std ::排序(m_pList,m_pList + getCount將( ),Compare_Functor(lFeature,TRUE));

我修復了代碼。感謝大家的幫助!

template <class T> 
class Compare_Functor 
{ 
public: 

    Compare_Functor(const long& lFeature, const bool& bIsAscending) 
    { 
     m_lFeature = lFeature; 
     m_bIsAscending = bIsAscending; 
    } 

    bool operator()(CVParent* lhs, CVParent* rhs) 
    { 
     double dFirstValue = reinterpret_cast< T * >(lhs)->GetValue(m_lFeature); 
     double dSecondValue = reinterpret_cast< T * >(rhs)->GetValue(m_lFeature); 
     .... 
    } 

private: 

    long m_lFeature; 
    bool m_bIsAscending; 
} 


//Usage 
std::sort(m_pList, m_pList+GetCOunt(), Compare_Functor<CChild>(lFeature, TRUE)); 
+2

你可以給你的原因,你要使用'reinterpret_cast'? – evnu

+0

1. IIRC(我現在沒有檢查過)它可以是模板參數。 2.你確定你想要'reinterpret_cast'(在大多數情況下,演員不是最好的編程風格,除非真的需要,否則應該避開它們)? –

+0

不,我想使用reinterpret_cast,但傳入的類型被轉換爲變量。 – AvatarBlue

回答

2

無法將任何動態(僅在運行時間中已知)類型傳遞到reinterpret_cast。它必須是靜態的(在編譯時已知)。

您可以使用模板,因爲在其他的答案中提到,但你需要明確設置爲投給每個函數調用的類型,因爲編譯器將無法從調用表達式推斷出這一點:

template <class T> struct Functor 
{ 
    bool operator()(CVParent* lhs, CVParent* rhs) { ... } 
}; 

CVParent p1, p2; 
... 

// Usage 
Functor<CVChild1>().operator()(&p1, &p2); 
Functor<CVChild2>().operator()(&p1, &p2); 
Functor<CVChild3>().operator()(&p1, &p2); 
+0

謝謝你的幫助!我做了更改,但不知道如何實際傳遞子類的類型,因爲我使用std :: sort來調用函子: – AvatarBlue

+0

std :: sort(m_pList,m_pList + GetCOunt(),Compare_Functor(lFeature, TRUE)); – AvatarBlue

+0

在這種情況下,您需要製作完整的仿函數模板,而不僅僅是operator()。我會編輯答案。 – Rost

1

您可以隨時在您的實施中使用template

template <class Type> 
bool operator()(CVParent* lhs, CVParent* rhs) 
{ 
    double dFirstValue = reinterpret_cast< Type * >(lhs)->GetValue(m_lFeature); 
    double dSecondValue = reinterpret_cast< Type * >(rhs)->GetValue(m_lFeature); 
    .... 
} 
+0

+1瞭解和回答問題。 –

1

我會建議使用模板,但類模板,而不是功能模板。這將使其更自然地在標準庫算法和contaiers使用:

template <typename T> 
struct CVFuntor 
{ 
    bool operator()(CVParent* lhs, CVParent* rhs) const 
    { 
    double dFirstValue = reinterpret_cast<T*>(lhs)->GetValue(m_lFeature); 
    double dSecondValue = reinterpret_cast<T*>(rhs)->GetValue(m_lFeature); 
    .... 
    } 
}; 

然後

typedef CVFunctor<CVChild> ParentToChild; 
typedef CVFunctor<CVOtherChild> ParentToOtherChild; 

.... 

ParentToChile p2ch; 
bool b = p2ch(SomeParentPtr1, SomeParentPtr2); 

你應該重新考慮你的reinterpret_cast使用。在我看來,要dynamic_cast選中的通話更適合在這裏:

T* t = dynamic_cast<T*>(lhs); 
if (!t) return false;