2013-03-13 60 views
2

均勻地返回void我有一個輔助功能是這樣的:處理方法與方法返回值

template<typename T, typename R, typename Arg0> 
void callMethod(Data *data, T &object, R (T::*method)(Arg0)) { 
    push(data, (object.*method)(get<Arg0>(data, 1))); 
} 

其中push推導致成數據,並獲取get從參數數據。使用boost預處理器我已經爲各種參數定義了這個函數。

問題是,當一個方法返回voidRvoid)代碼不編譯,因爲void不是有效的參數/參數到push功能。在void返回值的情況下,我想只調用該方法而不要調用push。最好的辦法是什麼?

重載呼叫沒有幫助的,然後到callMethod是模糊的:

template<typename T, typename Arg0> 
void callMethod(Data *data, T &object, void (T::*method)(Arg0)) { 
    (object.*method)(get<Arg0>(data, 1)); 
} 
+0

重載應做工精細;歧義被解決,有利於第二次重載。你會得到什麼錯誤? – ecatmur

+0

@ecatmur:VS 2012問題C2668 - 對重載函數的模糊調用。 –

回答

2

使用enable_if解決:

template<typename T, typename R, typename Arg0> 
typename enable_if<is_void<R>::value == false>::type 
callMethod(Data *data, T &object, R (T::*method)(Arg0)) { 
    push(data, (object.*method)(get<Arg0>(data, 1))); 
} 

template<typename T, typename R, typename Arg0> 
typename enable_if<is_void<R>::value == true>::type 
callMethod(Data *data, T &object, R (T::*method)(Arg0)) { 
    (object.*method)(get<Arg0>(data, 1)); 
}