处理方法使用返回值的方法均匀地返回void

时间:2013-03-13 15:39:33

标签: c++

我有一个这样的辅助函数:

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的有效参数/参数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));
}

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));
}