传递一个被调用方法的返回值throug std :: enable_if_t

时间:2016-03-26 08:57:46

标签: c++ templates c++14 sfinae enable-if

我有一个模板方法,它使用固定的参数值(如果存在的话)执行对象的基类方法,如果不存在则执行,并且它可以工作。 我正在使用sfinae和std :: enable_if_t来解决方法是否存在。

我没有得到的是 - 除了std :: enable_if_t之外,我如何传递调用方法的实际返回值。

这是我的代码的外观:

#define PREPARE_BASE_METHOD_W_2ARGS_CALL_HELPERS(METHOD_NAME, ARG1, ARG2) \
namespace detail{ \
  template <typename T, typename A1, typename A2> static auto test_##METHOD_NAME(int) -> sfinae_true<decltype(std::declval<T>().METHOD_NAME(std::declval<A1>(), std::declval<A2>()))>; \
  template <typename  , typename A1, typename A2> static auto test_##METHOD_NAME(long) -> std::false_type; \
  template <typename T, typename A1, typename A2> struct has_##METHOD_NAME : decltype(detail::test_##METHOD_NAME<T, A1, A2>(0)){}; \
  template <typename Base, typename T> auto call_##METHOD_NAME##_if_any(T& obj, ARG1 arg1, ARG2 arg2) -> std::enable_if_t<has_##METHOD_NAME<Base,ARG1,ARG2>::value, bool> { \
      obj.Base::METHOD_NAME(arg1, arg2); \
      return true; \
  } \
  template <typename Base, typename T> auto call_##METHOD_NAME##_if_any(T& obj, ARG1, ARG2) -> std::enable_if_t<!has_##METHOD_NAME<Base,ARG1,ARG2>::value, bool> { return false; } \
} \

是的,这是一个宏观,但我希望理解最新情况不会有任何问题。 在哪里和我如何从调用_ ## METHOD_NAME ## _ if_any(..)返回obj.Base :: METHOD_NAME(arg1,arg2)的结果?我很困惑,因为我认为,这里的回归已经被sfinae逻辑占据了。

1 个答案:

答案 0 :(得分:1)

这非常简单,只需将std::enable_if_t放在带有默认arg的template-params-list中,例如

template <typename Base, typename T, std::enable_if_t</*Your condition here*/, bool> = true>

然后您可以使用decltype(auto)作为实际的返回类型。