// 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 #include namespace test { using namespace boost::named_params; keyword name; keyword value; keyword index; keyword tester; struct f_parameters // vc6 is happier with inheritance than with a typedef : parameters< tester_ , name_ , value_ , index_ > {}; double value_default() { return 666.222; } template int f_impl(const Params& p) { p[tester]( p[name] , p[value || boost::bind(&value_default) ] // , p[value | 666.222 ] , p[index | 999 ] ); return 1; } template int f(Tester const& t, const Name& name_, const Value& value_, const Index& index_) { return f_impl(f_parameters()(t, name_, value_, index_)); } template int f(Tester const& t, const Name& name_, const Value& value_) { return f_impl(f_parameters()(t, name_, value_)); } template int f(Tester const& t, const Name& name_) { return f_impl(f_parameters()(t, name_)); } template int f_list(Params const& params) { return f_impl(params); } template bool equal(T const& x, T const& y) { return x == y; } bool equal(char const* s1, char const* s2) { return !strcmp(s1,s2); } template struct values_t { values_t(Name const& n, Value const& v, Index const& i) : n(n), v(v), i(i) {} template void operator()(Name_ const& n_, Value_ const& v_, Index_ const& i_) const { // Only VC and its emulators fail this; they seem to have // problems with deducing the constness of string literal // arrays. #if defined(_MSC_VER) \ && (BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 700) \ || BOOST_WORKAROUND(BOOST_MSVC, < 1310)) # else BOOST_STATIC_ASSERT((boost::is_same::value)); BOOST_STATIC_ASSERT((boost::is_same::value)); BOOST_STATIC_ASSERT((boost::is_same::value)); #endif assert(equal(n, n_)); assert(equal(v, v_)); assert(equal(i, i_)); } Name const& n; Value const& v; Index const& i; }; template values_t values(Name const& n, Value const& v, Index const& i) { return values_t(n,v,i); } typedef f_parameters g_parameters; template int g_impl(Args const& args) { return f(args); } template int g(A0 const& a0) { return g_impl(g_parameters(a0)); } template int g(A0 const& a0, A1 const& a1) { return g_impl(g_parameters(a0, a1)); } } // GCC2 has a problem with char (&)[] deduction, so we'll cast string // literals there. #undef S #if BOOST_WORKAROUND(__GNUC__, == 2) # define S(s) (char const*)s #else # define S(s) s #endif int main() { using test::f; using test::f_list; using test::name; using test::value; using test::index; using test::tester; f( test::values(S("foo"), S("bar"), S("baz")) , S("foo"), S("bar"), S("baz") ); int x = 56; f( test::values("foo", 666.222, 56) , index = boost::ref(x), name = "foo" ); f_list(( tester = test::values("foo", 666.222, 56) , index = boost::ref(x) , name = "foo" )); //f(index = 56, name = 55); // won't compile return 0; }