Files

78 lines
1.6 KiB
C++
Raw Permalink Normal View History

2004-01-17 14:15:20 +00:00
// Copyright David Abrahams, Daniel Wallin 2003. 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/named_params.hpp>
#include <cassert>
#include <string>
#include <boost/type_traits/is_convertible.hpp>
2004-01-17 15:53:40 +00:00
#include <iostream>
2004-01-17 14:15:20 +00:00
namespace test
{
2005-03-26 08:44:37 +00:00
using namespace boost::named_params;
2004-01-17 14:15:20 +00:00
2005-03-26 08:44:37 +00:00
keyword<struct name_> name;
keyword<struct value_> value;
2004-01-17 14:15:20 +00:00
2005-03-28 03:11:26 +00:00
struct f_parameters
: parameters<
2005-03-26 08:44:37 +00:00
optional<
name_
, boost::is_convertible<boost::mpl::_, std::string>
>
, optional<
value_
, boost::is_convertible<boost::mpl::_, float>
>
2004-01-17 15:53:40 +00:00
>
2004-01-17 14:15:20 +00:00
{};
2005-03-28 03:11:26 +00:00
template <class T> struct not_implemented;
2004-01-17 15:53:40 +00:00
template<class P>
void f_impl(P const& p)
2004-01-17 14:15:20 +00:00
{
std::string s = p[name | "bar"];
float v = p[value | 3.f];
2004-01-17 15:53:40 +00:00
2005-03-28 03:11:26 +00:00
std::cout << "s is " << s << std::endl;
2004-01-17 14:15:20 +00:00
assert(s == "foo");
assert(v == 3.f);
}
2005-03-28 03:11:26 +00:00
void f(...)
2004-01-17 15:53:40 +00:00
{
2005-03-28 03:11:26 +00:00
f_impl(f_parameters()());
2004-01-17 15:53:40 +00:00
}
template<class A0>
2004-01-17 15:58:17 +00:00
void f(A0 const& a0
2005-03-28 03:11:26 +00:00
, typename f_parameters::restrict<A0>::type = f_parameters())
2004-01-17 15:53:40 +00:00
{
2005-03-28 03:11:26 +00:00
f_impl(f_parameters()(a0));
2004-01-17 15:53:40 +00:00
}
template<class A0, class A1>
2004-01-17 15:58:17 +00:00
void f(A0 const& a0, A1 const& a1
2005-03-28 03:11:26 +00:00
, typename f_parameters::restrict<A0, A1>::type = f_parameters())
2004-01-17 15:53:40 +00:00
{
2005-03-28 03:11:26 +00:00
f_impl(f_parameters()(a0, a1));
2004-01-17 15:53:40 +00:00
}
2004-01-17 14:15:20 +00:00
} // namespace test
int main()
{
using test::name;
using test::value;
using test::f;
f("foo");
f("foo", 3.f);
f(value = 3.f, name = "foo");
2004-01-17 15:53:40 +00:00
return 0;
2004-01-17 14:15:20 +00:00
}