1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
/*<-
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 <boost/callable_traits/detail/config.hpp>
#ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
int main(){}
#else
//[ overview
#include <boost/callable_traits.hpp>
#include <type_traits>
#include <tuple>
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<pmf>,
int(number::*)(int)
>{}, "");
static_assert(is_same<
add_member_volatile_t<pmf>,
int(number::*)(int) const volatile
>{}, "");
static_assert(is_same<
class_of_t<pmf>,
number
>{}, "");
//` INVOKE-aware metafunctions:
static_assert(is_same<
args_t<pmf>,
tuple<const number&, int>
>{}, "");
static_assert(is_same<
return_type_t<pmf>,
int
>{}, "");
static_assert(is_same<
function_type_t<pmf>,
int(const number&, int)
>{}, "");
static_assert(is_same<
qualified_class_of_t<pmf>,
const number&
>{}, "");
//` Here are a few other trait examples:
static_assert(is_const_member<pmf>{}, "");
static_assert(!is_volatile_member<pmf>{}, "");
static_assert(!has_void_return<pmf>{}, "");
static_assert(!has_varargs<pmf>{}, "");
//]
int main() {}
#endif
|