2012-11-17 53 views
1

我想弄清楚如何讓C++模板使用查找表來執行其功能,但在編譯時不運行時。我無法把它變成文字,所以這裏是一個例子,和醜陋模板+預處理器宏的組合,我到目前爲止有:編譯時綁定一個C++模板?

template<class T_POD, class T_Corba> 
inline void c_to_corba_base(T_POD &In, CORBA::Any &Out) { 
    Out <<= static_cast<T_Corba>(In); 
} 

#define C_TO_CORBA_PAIR(T_POD, T_CORBA) \ 
inline void c_to_corba(T_POD &In, CORBA::Any &Out) { \ 
    c_to_corba_base<T_POD, T_CORBA>(In, Out); \ 
} 

C_TO_CORBA_PAIR(short, CORBA::Short) 
C_TO_CORBA_PAIR(long, CORBA::Long) 
C_TO_CORBA_PAIR(double, CORBA::Double) 
// etc. 

所以你可以看到,這類型轉換AB得到CC總是CORBA::Any。但B取決於A(在編譯時已知)。

我已經做了一些研究,它看起來像Boost::MPL::bind可能做我所需要的(我們已經需要升壓),但我不明白的語法。它可以全部在宏中完成,但如果可以完成,我寧願將其作爲「真實」模板。

有什麼建議嗎?

+0

我收集了一個'<< ='運算符,該運算符理解如何處理左側,該左側是對集合['中的'CORBA :: Any'和右側的引用] CORBA :: Short','CORBA :: Long','CORBA :: Double' ... etc.]所以你有一個很好的理由來介紹這個'c_to_corba'函數,而不是增強'<< ='定位一個'CORBA :: Any'接受簡單的類型? – HostileFork

+0

這對'corba_to_c'來說會更復雜一點。我問了同樣的問題,我試圖幫助這個人,他有一些問題。 –

回答

1

這樣比較好嗎?

template<typename> struct CorbaTypeMap; 
template<> struct CorbaTypeMap<short> { typedef CORBA::Short type; }; 
template<> struct CorbaTypeMap<long> { typedef CORBA::Long type; }; 
template<> struct CorbaTypeMap<double> { typedef CORBA::Double type; }; 

template<typename T_POD> 
inline void c_to_corba(T_POD &In, CORBA::Any &Out) { 
    Out <<= static_cast< /* typename */ CorbaTypeMap<T_POD>::type >(In); 
} 

我不認爲你需要的是typename關鍵字,因爲static_cast總是需要一個類型,但如果你得到一個錯誤,很可能會修復。

+0

這看起來不錯。你介意在頂部解釋空的'struct'等嗎? –

+1

@ AaronD.Marasco:它不是一個空的結構,它只是一個結構模板的聲明(根本沒有定義,空或者其他)。該聲明是必要的,因爲接下來的三行是專業化的,但是你不能專門化尚未聲明的模板。 –