// 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 #include #include #include #include namespace test { using namespace boost::named_params; keyword name; keyword value; struct f_parameters : parameters< optional< name_ , boost::is_convertible > , optional< value_ , boost::is_convertible > > {}; template struct not_implemented; template void f_impl(P const& p) { std::string s = p[name | "bar"]; float v = p[value | 3.f]; std::cout << "s is " << s << std::endl; assert(s == "foo"); assert(v == 3.f); } void f(...) { f_impl(f_parameters()()); } template void f(A0 const& a0 , typename f_parameters::restrict::type = f_parameters()) { f_impl(f_parameters()(a0)); } template void f(A0 const& a0, A1 const& a1 , typename f_parameters::restrict::type = f_parameters()) { f_impl(f_parameters()(a0, a1)); } } // 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"); return 0; }