【问题标题】:passing return value of a called method throug std::enable_if_t通过 std::enable_if_t 传递被调用方法的返回值
【发布时间】:2016-03-26 08:57:46
【问题描述】:

我有一个模板方法,它执行对象的基类方法,如果它存在,则使用固定的参数值,如果不存在则不存在,并且它可以工作。 我使用 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; } \
} \

是的,它是一个宏,但我希望理解发生的事情不会有问题。 我在哪里以及如何从 call_##METHOD_NAME##_if_any(..) 返回 obj.Base::METHOD_NAME(arg1, arg2) 的结果?我很困惑,因为我认为,这里的 return 已经被 sfinae 逻辑占据了。

【问题讨论】:

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


    【解决方案1】:

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

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

    那么你可以使用decltype(auto)作为实际的返回类型。

    【讨论】:

    • omfg,c++,你让我觉得自己太笨了,就像我从学校开始就没有一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2019-01-09
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多