передача возвращаемого значения вызываемого метода через std::enable_if_t

У меня есть метод шаблона, который выполняет метод базового класса объекта с фиксированным значением аргументов, если он существует, а если нет, и он работает. Я использовал 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; } \
} \

Да, это макрос, но я надеюсь, что проблем с пониманием происходящего не возникнет. Где и как я могу вернуть результат obj.Base::METHOD_NAME(arg1, arg2) из ​​call_##METHOD_NAME##_if_any(..)? Я смущен, потому что думаю, что возврат здесь уже занят логикой sfinae.


person Scott Tiger    schedule 26.03.2016    source источник


Ответы (1)


Это очень просто, просто поместите std::enable_if_t в список параметров шаблона с аргументом по умолчанию, например.

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

Затем вы можете использовать decltype(auto) для фактического типа возврата.

person Jamboree    schedule 26.03.2016
comment
omfg, c++, ты заставляешь меня чувствовать себя таким тупым, как со школы. - person Scott Tiger; 26.03.2016