/* Copyright Barrett Adair 2016 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #ifndef CT_ASSERT #define CT_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) #endif //CT_ASSERT struct foo {}; namespace ct = callable_traits; int main() { { using f = void(foo::*)(); using l = void(foo::*)() &; using r = void(foo::*)() && ; using c = void(foo::*)() const; using cl = void(foo::*)() const &; using cr = void(foo::*)() const &&; using v = void(foo::*)() volatile; using vl = void(foo::*)() volatile &; using vr = void(foo::*)() volatile &&; using cv = void(foo::*)() const volatile; using cvl = void(foo::*)() const volatile &; using cvr = void(foo::*)() const volatile &&; using va_f = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...); using va_l = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) &; using va_r = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) && ; using va_c = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const; using va_cl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const &; using va_cr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const &&; using va_v = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) volatile; using va_vl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) volatile &; using va_vr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) volatile &&; using va_cv = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const volatile; using va_cvl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const volatile &; using va_cvr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const volatile &&; CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); } { using f = void(foo::* const &)(int&, int&&); using l = void(foo::* const &)(int&, int&&) &; using r = void(foo::* const &)(int&, int&&) && ; using c = void(foo::* const &)(int&, int&&) const; using cl = void(foo::* const &)(int&, int&&) const &; using cr = void(foo::* const &)(int&, int&&) const &&; using v = void(foo::* const &)(int&, int&&) volatile; using vl = void(foo::* const &)(int&, int&&) volatile &; using vr = void(foo::* const &)(int&, int&&) volatile &&; using cv = void(foo::* const &)(int&, int&&) const volatile; using cvl = void(foo::* const &)(int&, int&&) const volatile &; using cvr = void(foo::* const &)(int&, int&&) const volatile &&; using va_f = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...); using va_l = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) &; using va_r = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) && ; using va_c = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const; using va_cl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const &; using va_cr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const &&; using va_v = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) volatile; using va_vl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) volatile &; using va_vr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) volatile &&; using va_cv = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const volatile; using va_cvl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const volatile &; using va_cvr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const volatile &&; CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); } { using f = void(); using l = void() &; using r = void() && ; using c = void() const; using cl = void() const &; using cr = void() const &&; using v = void() volatile; using vl = void() volatile &; using vr = void() volatile &&; using cv = void() const volatile; using cvl = void() const volatile &; using cvr = void() const volatile &&; using va_f = void(...); using va_l = void(...) &; using va_r = void(...) && ; using va_c = void(...) const; using va_cl = void(...) const &; using va_cr = void(...) const &&; using va_v = void(...) volatile; using va_vl = void(...) volatile &; using va_vr = void(...) volatile &&; using va_cv = void(...) const volatile; using va_cvl = void(...) const volatile &; using va_cvr = void(...) const volatile &&; CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); } { using f = void(*)(); using l = void(* &)(); using r = void(* &&)(); using c = void(* const)(); using cl = void(* const &)(); using cr = void(* const &&)(); using v = void(* volatile)(); using vl = void(* volatile &)(); using vr = void(* volatile &&)(); using cv = void(* const volatile)(); using cvl = void(* const volatile &)(); using cvr = void(* const volatile &&)(); using va_f = void(* )(...); using va_l = void(* &)(...); using va_r = void(* &&)(...); using va_c = void(* const)(...); using va_cl = void(* const &)(...); using va_cr = void(* const &&)(...); using va_v = void(* volatile)(...); using va_vl = void(* volatile &)(...); using va_vr = void(* volatile &&)(...); using va_cv = void(* const volatile)(...); using va_cvl = void(* const volatile &)(...); using va_cvr = void(* const volatile &&)(...); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); } { using f = void(&)(); using va_f = void(&)(...); CT_ASSERT(std::is_same>{}); } }