我有一个这样的辅助函数:
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预处理器我已经为不同数量的参数定义了这个函数。
问题是当方法返回void
(R
为void
)时代码无法编译,因为void
不是push
的有效参数/参数1}}功能。如果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 :(得分: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));
}