2013-03-13 125 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)); 
}