/*<- Copyright Barrett Adair 2016-2017 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 #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS int main(){} #else //[ overview #include #include #include using std::is_same; using std::tuple; using namespace boost::callable_traits; struct number { int value; int add(int n) const { return value + n; } }; using pmf = decltype(&number::add); //` Manipulate member functions pointers with ease: static_assert(is_same< remove_member_const_t, int(number::*)(int) >{}, ""); static_assert(is_same< add_member_volatile_t, int(number::*)(int) const volatile >{}, ""); static_assert(is_same< class_of_t, number >{}, ""); //` INVOKE-aware metafunctions: static_assert(is_same< args_t, tuple >{}, ""); static_assert(is_same< return_type_t, int >{}, ""); static_assert(is_same< function_type_t, int(const number&, int) >{}, ""); static_assert(is_same< qualified_class_of_t, const number& >{}, ""); //` Here are a few other trait examples: static_assert(is_const_member{}, ""); static_assert(!is_volatile_member{}, ""); static_assert(!has_void_return{}, ""); static_assert(!has_varargs{}, ""); //] int main() {} #endif