mirror of https://gitee.com/bigwinds/arangodb
111 lines
2.6 KiB
C++
Executable File
111 lines
2.6 KiB
C++
Executable File
// Copyright Daniel Wallin 2006. Use, modification and distribution is
|
|
// 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)
|
|
|
|
#include <boost/parameter.hpp>
|
|
#include <boost/mpl/assert.hpp>
|
|
#include <boost/type_traits/is_same.hpp>
|
|
#include <boost/type_traits/is_base_and_derived.hpp>
|
|
|
|
namespace mpl = boost::mpl;
|
|
namespace parameter = boost::parameter;
|
|
|
|
template <class T = int>
|
|
struct a0_is
|
|
: parameter::template_keyword<a0_is<>, T>
|
|
{};
|
|
|
|
template <class T = int>
|
|
struct a1_is
|
|
: parameter::template_keyword<a1_is<>, T>
|
|
{};
|
|
|
|
template <class T = int>
|
|
struct a2_is
|
|
: parameter::template_keyword<a2_is<>, T>
|
|
{};
|
|
|
|
template <class T = int>
|
|
struct a3_is
|
|
: parameter::template_keyword<a3_is<>, T>
|
|
{};
|
|
|
|
struct X {};
|
|
struct Y : X {};
|
|
|
|
template <
|
|
class A0 = parameter::void_
|
|
, class A1 = parameter::void_
|
|
, class A2 = parameter::void_
|
|
, class A3 = parameter::void_
|
|
>
|
|
struct with_ntp
|
|
{
|
|
typedef typename parameter::parameters<
|
|
a0_is<>, a1_is<>, a2_is<>
|
|
, parameter::optional<
|
|
parameter::deduced<a3_is<> >
|
|
, boost::is_base_and_derived<X, mpl::_>
|
|
>
|
|
>::bind<A0,A1,A2,A3
|
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
|
, parameter::void_
|
|
#endif
|
|
>::type args;
|
|
|
|
typedef typename parameter::binding<
|
|
args, a0_is<>, void*
|
|
>::type a0;
|
|
|
|
typedef typename parameter::binding<
|
|
args, a1_is<>, void*
|
|
>::type a1;
|
|
|
|
typedef typename parameter::binding<
|
|
args, a2_is<>, void*
|
|
>::type a2;
|
|
|
|
typedef typename parameter::binding<
|
|
args, a3_is<>, void*
|
|
>::type a3;
|
|
|
|
typedef void(*type)(a0,a1,a2,a3);
|
|
};
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<>::type, void(*)(void*,void*,void*,void*)
|
|
>));
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<a2_is<int> >::type, void(*)(void*,void*,int,void*)
|
|
>));
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<a1_is<int> >::type, void(*)(void*,int,void*,void*)
|
|
>));
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<a2_is<int const>, a1_is<float> >::type, void(*)(void*,float,int const,void*)
|
|
>));
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<int const>::type, void(*)(int const, void*, void*,void*)
|
|
>));
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<int, float>::type, void(*)(int, float, void*,void*)
|
|
>));
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<int, float, char>::type, void(*)(int, float, char,void*)
|
|
>));
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<a0_is<int>, Y>::type, void(*)(int,void*,void*, Y)
|
|
>));
|
|
|
|
BOOST_MPL_ASSERT((boost::is_same<
|
|
with_ntp<int&, a2_is<char>, Y>::type, void(*)(int&,void*,char, Y)
|
|
>));
|
|
|