sfinae.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 105 行
CPP
105 行
// 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/parameter.hpp>#include <boost/parameter/match.hpp>#include <boost/detail/lightweight_test.hpp>#include <string>#include <boost/type_traits/is_convertible.hpp>#if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))# include <boost/utility/enable_if.hpp># include <boost/type_traits/is_same.hpp>#endif namespace test{ BOOST_PARAMETER_KEYWORD(keywords,name) BOOST_PARAMETER_KEYWORD(keywords,value) using namespace boost::parameter; struct f_parameters : parameters< optional< keywords::name , boost::is_convertible<boost::mpl::_, std::string> > , optional< keywords::value , boost::is_convertible<boost::mpl::_, float> > > {}; // The use of assert_equal_string is just a nasty workaround for a // vc++ 6 ICE. void assert_equal_string(std::string x, std::string y) { BOOST_TEST(x == y); } template<class P> void f_impl(P const& p) { float v = p[value | 3.f]; BOOST_TEST(v == 3.f); assert_equal_string(p[name | "bar"], "foo"); } void f() { f_impl(f_parameters()()); } template<class A0> void f( A0 const& a0 , BOOST_PARAMETER_MATCH(f_parameters, (A0), args)) { f_impl(args(a0)); } template<class A0, class A1> void f( A0 const& a0, A1 const& a1 , BOOST_PARAMETER_MATCH(f_parameters,(A0)(A1), args)) { f_impl(args(a0, a1)); }#if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) // On compilers that actually support SFINAE, add another overload // that is an equally good match and can only be in the overload set // when the others are not. This tests that the SFINAE is actually // working. On all other compilers we're just checking that // everything about SFINAE-enabled code will work, except of course // the SFINAE. template<class A0, class A1> typename boost::enable_if<boost::is_same<int,A0>, int>::type f(A0 const& a0, A1 const& a1) { return 0; }#endif } // namespace testint main(){ using test::name; using test::value; using test::f; f("foo"); f("foo", 3.f); f(value = 3.f, name = "foo");#if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) BOOST_TEST(f(3, 4) == 0);#endif return boost::report_errors();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?