通过 std::enable_if_t 传递被调用方法的 return 值

passing return value of a called method throug std::enable_if_t

我有一个模板方法,它执行对象的基本 class 方法,如果它存在,则使用固定参数值,如果不存在,则不执行,并且它有效。 我正在使用带有 std::enable_if_t 的 sfinae 来解决是否存在方法。

我不明白的是 - 我如何传递调用方法的实际 return 值,超出 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; } \
} \

是的,这是一个宏,但我希望理解发生了什么事没有问题。 我在哪里和我如何 return 来自 call_##METHOD_NAME##_if_any(.. )?我很困惑,因为我认为,这里的 return 已经被 sfinae 逻辑占用了。

非常简单,只需将 std::enable_if_t 放入带有默认参数的模板参数列表中,例如

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

然后你可以使用 decltype(auto) 作为实际的 return 类型。