// Boost.Convert test and usage example // Copyright (c) 2009-2016 Vladimir Batov. // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. See http://www.boost.org/LICENSE_1_0.txt. #include "./test.hpp" #if defined(BOOST_CONVERT_IS_NOT_SUPPORTED) int main(int, char const* []) { return 0; } #else #include #include #include #include #include using std::string; using boost::convert; using boost::lexical_cast; //[callable_example1 void plain_old_func(string const& value_in, boost::optional& value_out) //] { try { value_out = lexical_cast(value_in); } catch (...) { } } template void convert_all(TypeIn const&, boost::optional&) { } template void assign(boost::optional& value_out, Type const& value_in) { value_out = value_in; } struct converter1 { template void operator()(TypeIn const&, boost::optional&) const { } }; //[callable_example4 struct take_double { void operator()(double, boost::optional&) const {}}; struct take_int { void operator()(int, boost::optional&) const {}}; //] //[callable_example6 struct double_only { // Declared for all types. template void operator()(TypeIn, boost::optional&) const; }; // Defined only for certain types. template<> void double_only::operator()(double, boost::optional&) const {} //] int main(int, char const* []) { typedef boost::function&)> boost_func; char const* const str = "-12"; // Testing old-function-based converter. //[callable_example2 int v01 = convert(str, plain_old_func).value_or(-1); //] // Testing boost::function-based converter. int v02 = convert(str, boost_func(plain_old_func)).value_or(-1); // Testing crazy boost::bind-based converter. //[callable_example3 int v03 = convert(str, boost::bind(assign, _2, boost::bind(lexical_cast, _1))).value_or(-1); //] BOOST_TEST(v01 == -12); BOOST_TEST(v02 == -12); BOOST_TEST(v03 == -12); convert(str, convert_all); convert(11, convert_all); convert< int>(str, converter1()); convert(11, converter1()); convert(11.23, take_double()); convert(11, take_int()); //[callable_example5 convert(11, take_double()); // Compiler applies int-to-double promotion to call the converter. convert(11.23, take_int()); // Compiler applies double-to-int implicit truncation. //] //[callable_example7 convert(11.23, double_only()); // Fine. // convert(11, double_only()); // Fails: undefined reference to double_only::operator() //] return boost::report_errors(); } #endif