Varsa, var olmayan bir argüman değeriyle nesnenin temel sınıf yöntemini yürüten bir şablon yöntemim var. işe yarıyor. Bir yöntemin var olup olmadığını çözmek için std :: enable_if_t ile sfinae kullanıyordum. Ben alamadımaranan yöntemin dönüş değeri iletiliyor std :: enable_if_t
şey - Ben geçiş nasıl çağıran yöntemin gerçek dönüş değeri, std :: enable_if_t ötesinde.
Bu benim kod görünür:
#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; } \
} \
Evet, bir makro, ama ne oluyor anlamak sorun yok olacağını umuyoruz. Nerede ve nasıl sonuçta obj.Base :: METHOD_NAME (arg1, arg2) sonucunu döndürdüğüm _ ## METHOD_NAME ## _ if_any (..)? Kafam karıştı, çünkü bence, buradaki dönüş, zaten sfinae mantığı tarafından işgal edildi.
omfg, C++, okuldan beri yapmadığım gibi, beni çok aptal hissettiriyorsunuz. –