/* 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; using pmf = void(foo::*)(); using pmf_l = void(foo::*)() &; using pmf_r = void(foo::*)() &&; using pmf_c = void(foo::*)() const; using pmf_cl = void(foo::*)() const &; using pmf_cr = void(foo::*)() const &&; using pmf_v = void(foo::*)() volatile; using pmf_vl = void(foo::*)() volatile &; using pmf_vr = void(foo::*)() volatile &&; using pmf_cv = void(foo::*)() const volatile; using pmf_cvl = void(foo::*)() const volatile &; using pmf_cvr = void(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>{}); 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(!ct::is_const_qualified()); CT_ASSERT(!ct::is_const_qualified(pmf{})); CT_ASSERT(!ct::is_const_qualified()); CT_ASSERT(!ct::is_const_qualified(pmf_l{})); CT_ASSERT(!ct::is_const_qualified()); CT_ASSERT(!ct::is_const_qualified(pmf_r{})); CT_ASSERT(ct::is_const_qualified()); CT_ASSERT(ct::is_const_qualified(pmf_c{})); CT_ASSERT(ct::is_const_qualified()); CT_ASSERT(ct::is_const_qualified(pmf_cl{})); CT_ASSERT(ct::is_const_qualified()); CT_ASSERT(ct::is_const_qualified(pmf_cr{})); CT_ASSERT(!ct::is_const_qualified()); CT_ASSERT(!ct::is_const_qualified(pmf_v{})); CT_ASSERT(!ct::is_const_qualified()); CT_ASSERT(!ct::is_const_qualified(pmf_vl{})); CT_ASSERT(!ct::is_const_qualified()); CT_ASSERT(!ct::is_const_qualified(pmf_vr{})); CT_ASSERT(ct::is_const_qualified()); CT_ASSERT(ct::is_const_qualified(pmf_cv{})); CT_ASSERT(ct::is_const_qualified()); CT_ASSERT(ct::is_const_qualified(pmf_cvl{})); CT_ASSERT(ct::is_const_qualified()); CT_ASSERT(ct::is_const_qualified(pmf_cvr{})); CT_ASSERT(!ct::is_volatile_qualified()); CT_ASSERT(!ct::is_volatile_qualified(pmf{})); CT_ASSERT(!ct::is_volatile_qualified()); CT_ASSERT(!ct::is_volatile_qualified(pmf_l{})); CT_ASSERT(!ct::is_volatile_qualified()); CT_ASSERT(!ct::is_volatile_qualified(pmf_r{})); CT_ASSERT(!ct::is_volatile_qualified()); CT_ASSERT(!ct::is_volatile_qualified(pmf_c{})); CT_ASSERT(!ct::is_volatile_qualified()); CT_ASSERT(!ct::is_volatile_qualified(pmf_cl{})); CT_ASSERT(!ct::is_volatile_qualified()); CT_ASSERT(!ct::is_volatile_qualified(pmf_cr{})); CT_ASSERT(ct::is_volatile_qualified()); CT_ASSERT(ct::is_volatile_qualified(pmf_v{})); CT_ASSERT(ct::is_volatile_qualified()); CT_ASSERT(ct::is_volatile_qualified(pmf_vl{})); CT_ASSERT(ct::is_volatile_qualified()); CT_ASSERT(ct::is_volatile_qualified(pmf_vr{})); CT_ASSERT(ct::is_volatile_qualified()); CT_ASSERT(ct::is_volatile_qualified(pmf_cv{})); CT_ASSERT(ct::is_volatile_qualified()); CT_ASSERT(ct::is_volatile_qualified(pmf_cvl{})); CT_ASSERT(ct::is_volatile_qualified()); CT_ASSERT(ct::is_volatile_qualified(pmf_cvr{})); CT_ASSERT(!ct::is_reference_qualified()); CT_ASSERT(!ct::is_reference_qualified(pmf{})); CT_ASSERT(ct::is_reference_qualified()); CT_ASSERT(ct::is_reference_qualified(pmf_l{})); CT_ASSERT(ct::is_reference_qualified()); CT_ASSERT(ct::is_reference_qualified(pmf_r{})); CT_ASSERT(!ct::is_reference_qualified()); CT_ASSERT(!ct::is_reference_qualified(pmf_c{})); CT_ASSERT(ct::is_reference_qualified()); CT_ASSERT(ct::is_reference_qualified(pmf_cl{})); CT_ASSERT(ct::is_reference_qualified()); CT_ASSERT(ct::is_reference_qualified(pmf_cr{})); CT_ASSERT(!ct::is_reference_qualified()); CT_ASSERT(!ct::is_reference_qualified(pmf_v{})); CT_ASSERT(ct::is_reference_qualified()); CT_ASSERT(ct::is_reference_qualified(pmf_vl{})); CT_ASSERT(ct::is_reference_qualified()); CT_ASSERT(ct::is_reference_qualified(pmf_vr{})); CT_ASSERT(!ct::is_reference_qualified()); CT_ASSERT(!ct::is_reference_qualified(pmf_cv{})); CT_ASSERT(ct::is_reference_qualified()); CT_ASSERT(ct::is_reference_qualified(pmf_cvl{})); CT_ASSERT(ct::is_reference_qualified()); CT_ASSERT(ct::is_reference_qualified(pmf_cvr{})); CT_ASSERT(!ct::is_lvalue_qualified()); CT_ASSERT(!ct::is_lvalue_qualified(pmf{})); CT_ASSERT(ct::is_lvalue_qualified()); CT_ASSERT(ct::is_lvalue_qualified(pmf_l{})); CT_ASSERT(!ct::is_lvalue_qualified()); CT_ASSERT(!ct::is_lvalue_qualified(pmf_r{})); CT_ASSERT(!ct::is_lvalue_qualified()); CT_ASSERT(!ct::is_lvalue_qualified(pmf_c{})); CT_ASSERT(ct::is_lvalue_qualified()); CT_ASSERT(ct::is_lvalue_qualified(pmf_cl{})); CT_ASSERT(!ct::is_lvalue_qualified()); CT_ASSERT(!ct::is_lvalue_qualified(pmf_cr{})); CT_ASSERT(!ct::is_lvalue_qualified()); CT_ASSERT(!ct::is_lvalue_qualified(pmf_v{})); CT_ASSERT(ct::is_lvalue_qualified()); CT_ASSERT(ct::is_lvalue_qualified(pmf_vl{})); CT_ASSERT(!ct::is_lvalue_qualified()); CT_ASSERT(!ct::is_lvalue_qualified(pmf_vr{})); CT_ASSERT(!ct::is_lvalue_qualified()); CT_ASSERT(!ct::is_lvalue_qualified(pmf_cv{})); CT_ASSERT(ct::is_lvalue_qualified()); CT_ASSERT(ct::is_lvalue_qualified(pmf_cvl{})); CT_ASSERT(!ct::is_lvalue_qualified()); CT_ASSERT(!ct::is_lvalue_qualified(pmf_cvr{})); CT_ASSERT(!ct::is_rvalue_qualified()); CT_ASSERT(!ct::is_rvalue_qualified(pmf{})); CT_ASSERT(!ct::is_rvalue_qualified()); CT_ASSERT(!ct::is_rvalue_qualified(pmf_l{})); CT_ASSERT(ct::is_rvalue_qualified()); CT_ASSERT(ct::is_rvalue_qualified(pmf_r{})); CT_ASSERT(!ct::is_rvalue_qualified()); CT_ASSERT(!ct::is_rvalue_qualified(pmf_c{})); CT_ASSERT(!ct::is_rvalue_qualified()); CT_ASSERT(!ct::is_rvalue_qualified(pmf_cl{})); CT_ASSERT(ct::is_rvalue_qualified()); CT_ASSERT(ct::is_rvalue_qualified(pmf_cr{})); CT_ASSERT(!ct::is_rvalue_qualified()); CT_ASSERT(!ct::is_rvalue_qualified(pmf_v{})); CT_ASSERT(!ct::is_rvalue_qualified()); CT_ASSERT(!ct::is_rvalue_qualified(pmf_vl{})); CT_ASSERT(ct::is_rvalue_qualified()); CT_ASSERT(ct::is_rvalue_qualified(pmf_vr{})); CT_ASSERT(!ct::is_rvalue_qualified()); CT_ASSERT(!ct::is_rvalue_qualified(pmf_cv{})); CT_ASSERT(!ct::is_rvalue_qualified()); CT_ASSERT(!ct::is_rvalue_qualified(pmf_cvl{})); CT_ASSERT(ct::is_rvalue_qualified()); CT_ASSERT(ct::is_rvalue_qualified(pmf_cvr{})); int main() { return 0; }