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

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

本文关键字:调用 方法 返回值 std enable if 通过      更新时间:2023-10-16

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

我不知道的是,如何传递调用方法的实际返回值,而不是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逻辑占据了。

这很简单,只需将std::enable_if_t放在模板参数列表中,并使用默认参数,例如

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

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