2016-03-26 3 views
0

У меня есть метод шаблона, который выполняет метод базового класса объекта с фиксированным значением аргументов, если он существует, a и не существует, если не существует, и оно работает. Я использовал sfinae с std :: enable_if_t, чтобы решить, существует ли метод.Передача возвращаемого значения вызываемого метода throug 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) из ​​вызова _ ## METHOD_NAME ## _ if_any (..)? Я смущен, потому что я думаю, что возвращение здесь уже занято логикой sfinae.

ответ

1

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

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

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

+0

omfg, C++, вы заставляете меня чувствовать себя сумасшедшим, как будто я не со школы. –