82 lines
3.6 KiB
C++
82 lines
3.6 KiB
C++
|
|
// (C) Copyright John Maddock 2005.
|
||
|
|
// Use, modification and distribution are subject to the
|
||
|
|
// Boost Software License, Version 1.0. (See accompanying file
|
||
|
|
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
|
|
||
|
|
#ifdef TEST_STD_HEADERS
|
||
|
|
#include <functional>
|
||
|
|
#else
|
||
|
|
#include <boost/tr1/functional.hpp>
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#include <boost/static_assert.hpp>
|
||
|
|
#include <boost/type_traits/is_convertible.hpp>
|
||
|
|
#include <boost/type_traits/is_same.hpp>
|
||
|
|
#include <boost/type_traits/is_base_and_derived.hpp>
|
||
|
|
#include "verify_return.hpp"
|
||
|
|
|
||
|
|
struct test_type
|
||
|
|
{
|
||
|
|
int member();
|
||
|
|
int cmember()const;
|
||
|
|
int member2(char);
|
||
|
|
int cmember2(char)const;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct functor1 : public std::unary_function<int, double>
|
||
|
|
{
|
||
|
|
double operator()(int)const;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct functor2 : public std::binary_function<int, char, double>
|
||
|
|
{
|
||
|
|
double operator()(int, char)const;
|
||
|
|
};
|
||
|
|
|
||
|
|
int main()
|
||
|
|
{
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::unary_function<int, double>, std::tr1::reference_wrapper<double (int)> >::value));
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::unary_function<int, double>, std::tr1::reference_wrapper<double (*)(int)> >::value));
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::unary_function<test_type*, int>, std::tr1::reference_wrapper<int (test_type::*)()> >::value));
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::unary_function<const test_type*, int>, std::tr1::reference_wrapper<int (test_type::*)()const> >::value));
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::unary_function<int, double>, std::tr1::reference_wrapper<functor1> >::value));
|
||
|
|
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::binary_function<int, char, double>, std::tr1::reference_wrapper<double (int, char)> >::value));
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::binary_function<int, char, double>, std::tr1::reference_wrapper<double (*)(int, char)> >::value));
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::binary_function<test_type*, char, int>, std::tr1::reference_wrapper<int (test_type::*)(char)> >::value));
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::binary_function<const test_type*, char, int>, std::tr1::reference_wrapper<int (test_type::*)(char)const> >::value));
|
||
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::binary_function<int, char, double>, std::tr1::reference_wrapper<functor2> >::value));
|
||
|
|
|
||
|
|
test_type* ptt = 0;
|
||
|
|
test_type const* cptt = 0;
|
||
|
|
int zero = 0;
|
||
|
|
|
||
|
|
// now check operator():
|
||
|
|
std::tr1::reference_wrapper<double (int)>* pr1;
|
||
|
|
verify_return_type((*pr1)(0), double());
|
||
|
|
std::tr1::reference_wrapper<double (*)(int)>* pr2;
|
||
|
|
verify_return_type((*pr2)(0), double());
|
||
|
|
std::tr1::reference_wrapper<int (test_type::*)()>* pr3;
|
||
|
|
verify_return_type((*pr3)(ptt), int());
|
||
|
|
std::tr1::reference_wrapper<int (test_type::*)()const>* pr4;
|
||
|
|
verify_return_type((*pr4)(cptt), int());
|
||
|
|
std::tr1::reference_wrapper<functor1>* pr5;
|
||
|
|
verify_return_type((*pr5)(zero), double());
|
||
|
|
|
||
|
|
std::tr1::reference_wrapper<double (int, char)>* pr1b;
|
||
|
|
verify_return_type((*pr1b)(0,0), double());
|
||
|
|
std::tr1::reference_wrapper<double (*)(int, char)>* pr2b;
|
||
|
|
verify_return_type((*pr2b)(0,0), double());
|
||
|
|
std::tr1::reference_wrapper<int (test_type::*)(char)>* pr3b;
|
||
|
|
verify_return_type((*pr3b)(ptt,zero), int());
|
||
|
|
std::tr1::reference_wrapper<int (test_type::*)(char)const>* pr4b;
|
||
|
|
verify_return_type((*pr4b)(cptt,zero), int());
|
||
|
|
std::tr1::reference_wrapper<functor2>* pr5b;
|
||
|
|
verify_return_type((*pr5b)(zero, zero), double());
|
||
|
|
|
||
|
|
// check implicit convertion:
|
||
|
|
int i = 0;
|
||
|
|
int& ri = std::tr1::ref(i);
|
||
|
|
const int& cri = std::tr1::cref(i);
|
||
|
|
}
|