2016-03-26 17 views
0

Ich habe eine Vorlage Methode, die eine Basisklasse Methode des Objekts mit einem festen Wert von Argumenten ausgeführt, wenn es existiert, und nicht, wenn nicht, und Es klappt. Ich habe sfinae mit std :: enable_if_t verwendet, um aufzulösen, ob eine Methode existiert.Übergabe Rückgabewert einer aufgerufenen Methode durch std :: enable_if_t

Die Sache, die ich nicht bekomme, ist - wie ich den tatsächlichen Rückgabewert der aufrufenden Methode übergeben kann, jenseits von std :: enable_if_t. Diese

ist, wie mein Code aussieht:

#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; } \ 
} \ 

Ja, es ist ein Makro, aber ich hoffe, es wird kein Problem sein, zu verstehen, was los ist. Wo und wie kann ich das Ergebnis von obj.Base :: METHOD_NAME (arg1, arg2) vom Aufruf _ ## METHOD_NAME ## _ if_any (..)? Ich bin verwirrt, weil ich denke, dass die Rückkehr hier bereits von der Logik der Sfinae besetzt ist.

Antwort

1

Es ist sehr einfach, setzen Sie einfach die std::enable_if_t in der Template-Parameter-Liste mit einem Standard-Arg, z.

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

Dann können Sie decltype(auto) für den tatsächlichen Rückgabetyp verwenden.

+0

omfg, C++, du machst mich so dumm, wie ich es seit der Schule nicht mehr getan habe. –