| // Copyright 2013 Antony Polukhin |
| |
| // Distributed under the Boost Software License, Version 1.0. |
| // (See the accompanying file LICENSE_1_0.txt |
| // or a copy at <http://www.boost.org/LICENSE_1_0.txt>.) |
| |
| |
| //[lexical_cast_stringize |
| /*` |
| In this example we'll make a `stringize` method that accepts a sequence, converts |
| each element of the sequence into string and appends that string to the result. |
| |
| Example is based on the example from the [@http://www.packtpub.com/boost-cplusplus-application-development-cookbook/book Boost C++ Application Development Cookbook] |
| by Antony Polukhin, ISBN 9781849514880. |
| |
| Step 1: Making a functor that converts any type to a string and remembers result: |
| */ |
| |
| #include <boost/lexical_cast.hpp> |
| |
| struct stringize_functor { |
| private: |
| std::string& result; |
| |
| public: |
| explicit stringize_functor(std::string& res) |
| : result(res) |
| {} |
| |
| template <class T> |
| void operator()(const T& v) const { |
| result += boost::lexical_cast<std::string>(v); |
| } |
| }; |
| |
| //` Step 2: Applying `stringize_functor` to each element in sequence: |
| #include <boost/fusion/include/for_each.hpp> |
| template <class Sequence> |
| std::string stringize(const Sequence& seq) { |
| std::string result; |
| boost::fusion::for_each(seq, stringize_functor(result)); |
| return result; |
| } |
| |
| //` Step 3: Using the `stringize` with different types: |
| #include <cassert> |
| #include <boost/fusion/adapted/boost_tuple.hpp> |
| #include <boost/fusion/adapted/std_pair.hpp> |
| |
| int main() { |
| boost::tuple<char, int, char, int> decim('-', 10, 'e', 5); |
| assert(stringize(decim) == "-10e5"); |
| |
| std::pair<short, std::string> value_and_type(270, "Kelvin"); |
| assert(stringize(value_and_type) == "270Kelvin"); |
| } |
| |
| //] [/lexical_cast_stringize] |
| |
| |
| |