⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fill_em_up.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 CPP
字号:
/*=============================================================================    Copyright (c) 2006 Joel de Guzman    Distributed under 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)    Problem:    So... you have an input sequence I and a target vector R. You want to    copy I into R. But, I may have less elements than the result vector R.    For those elements not in R, you want them to be default constructed.    Here's a case:            I: list<double, std::string>        R: vector<double, std::string, int, short>        You want the elements at the right of I not in R (i.e. int, short)    default constructed. Those at the left, found in both I and R, you want    to simply copy from I.        Of course you want to be able to handle any type of I and R.==============================================================================*/// We'll use these containers as examples#include <boost/fusion/container/list.hpp>#include <boost/fusion/container/vector.hpp>// For doing I/O#include <boost/fusion/sequence/io.hpp>// We'll use join and advance for processing#include <boost/fusion/algorithm/transformation/join.hpp>#include <boost/fusion/iterator/advance.hpp>// The fusion <--> MPL link header#include <boost/fusion/mpl.hpp>// Same-o same-o#include <iostream>#include <string>intmain(){    using namespace boost::fusion;    using namespace boost;        // Let's specify our own tuple delimeters for nicer printing    std::cout << tuple_open('[');    std::cout << tuple_close(']');    std::cout << tuple_delimiter(", ");    // Here's your input sequence    typedef list<double, std::string> I;    I i(123.456, "Hello");        // Here's your output sequence. For now, it is just a typedef    typedef vector<double, std::string, int, short> R;    // Let's get the sizes of the sequences. Yeah, you already know that.    // But with templates, you are simply given, say, R and I, corresponding     // to the types of the sequences. You'll have to deal with it generically.    static int const r_size = result_of::size<R>::value;    static int const i_size = result_of::size<I>::value;    // Make sure that I has no more elements than R    // Be nice and catch obvious errors earlier rather than later.    // Without this assert, the mistake will still be caught by Fusion,    // but the error will point to somewhere really obscure.    BOOST_STATIC_ASSERT(i_size <= r_size);    // Let's get the begin and end iterator types of the output sequence    // There's no actual vector yet. We just want to know the types.    typedef result_of::begin<R>::type r_begin;    typedef result_of::end<R>::type r_end;    // Let's skip i_size elements from r_begin. Again, we just want to know the type.    typedef result_of::advance_c<r_begin, i_size>::type r_advance;    // Now, make MPL iterators from r_advance and r_end. Ditto, just types.    typedef mpl::fusion_iterator<r_advance> mpl_r_advance;    typedef mpl::fusion_iterator<r_end> mpl_r_end;    // Make an mpl::iterator_range from the MPL iterators we just created     // You guessed it! --just a type.    typedef mpl::iterator_range<mpl_r_advance, mpl_r_end> tail;    // Use join to join the input sequence and our mpl::iterator_range    // Our mpl::iterator_range is 'tail'. Here, we'll actually instantiate    // 'tail'. Notice that this is a flyweight object, typically just 1 byte    // in size -- it doesn't really hold any data, but is a fully conforming    // sequence nonetheless. When asked to return its elements, 'tail' returns    // each element default constructed. Breeds like a rabbit!    // Construct R from the joined sequences:    R r(join(i, tail()));        // Then finally, print the result:    std::cout << r << std::endl;    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -