497 #include <type_traits>
527 template<
class Base,
class Obj>
530 static std::true_type test(Base*);
531 static std::false_type test(...);
533 typedef decltype(test(static_cast<Obj*>(0))) TestObjType;
534 typedef decltype(test(static_cast<void*>(0))) TestVoidType;
552 static const bool value = TestObjType::value ==
true
553 && TestVoidType::value ==
false;
582 template <
class Base,
class Obj>
585 "Cgu::DoIf::assert_related_to_type() failed");
612 template <
class Base,
class Obj>
615 "Cgu::DoIf::assert_related_to_type() failed");
635 template <
class T1,
class T2>
638 "Cgu::DoIf::assert_same_type() failed");
663 template <
class T1,
class T2>
668 "Cgu::DoIf::assert_same_type() failed");
699 template <
class T1,
class T2>
702 "Cgu::DoIf::assert_related_types() failed");
723 static_assert(
RelatedTest<
typename std::remove_const<T>::type, T>::value,
724 "Cgu::DoIf::assert_not_const() failed");
727 #ifndef DOXYGEN_PARSING
741 template <
bool value,
class Ret>
749 struct cond_call<true, Ret> {
750 template <
class T,
class Func,
class... Args>
751 static Ret exec(T& obj,
754 return (obj.*func)(std::forward<Args>(args)...);
757 template <
class T,
class Func,
class... Args>
758 static Ret exec_static(T& obj,
761 return func(&obj, std::forward<Args>(args)...);
768 struct cond_call<false, Ret> {
769 template <
class T,
class Func,
class... Args>
776 template <
class T,
class Func,
class... Args>
777 static Ret exec_static(T&,
787 struct cond_call<true, void> {
788 template <
class T,
class Func,
class... Args>
789 static void exec(T& obj,
792 (obj.*func)(std::forward<Args>(args)...);
795 template <
class T,
class Func,
class... Args>
796 static void exec_static(T& obj,
799 func(&obj, std::forward<Args>(args)...);
806 struct cond_call<false, void> {
807 template <
class T,
class Func,
class... Args>
812 template <
class T,
class Func,
class... Args>
813 static void exec_static(T&,
838 template <
class Base,
class Obj,
class Ret,
class... Params,
class... Args>
840 Ret (Base::*func)(Params...),
842 return cond_call<RelatedTest<Base, Obj>::value, Ret>::exec(obj, func,
843 std::forward<Args>(args)...);
858 template <
class Base,
class Obj,
class... Params,
class... Args>
860 void (Base::*func)(Params...),
862 cond_call<RelatedTest<Base, Obj>::value,
void>::exec(obj, func,
863 std::forward<Args>(args)...);
884 template <
class Base,
class Obj,
class Ret,
class... Params,
class... Args>
886 Ret (Base::*func)(Params...)
const,
888 return cond_call<RelatedTest<Base, Obj>::value, Ret>::exec(obj, func,
889 std::forward<Args>(args)...);
904 template <
class Base,
class Obj,
class... Params,
class... Args>
906 void (Base::*func)(Params...)
const,
908 cond_call<RelatedTest<Base, Obj>::value,
void>::exec(obj, func,
909 std::forward<Args>(args)...);
931 template <
class Base,
class Obj,
class Ret,
class... Params,
class... Args>
933 Ret (*func)(Base*, Params...),
935 return cond_call<RelatedTest<Base, Obj>::value, Ret>::exec_static(obj, func,
936 std::forward<Args>(args)...);
952 template <
class Base,
class Obj,
class... Params,
class... Args>
954 void (*func)(Base*, Params...),
956 cond_call<RelatedTest<Base, Obj>::value,
void>::exec_static(obj, func,
957 std::forward<Args>(args)...);