| 输入策略 | ![]() |
![]() |
![]() |
输入策略类型可以被指定为wave::context对象的模板参数,用于定制包含文件如何被表示,通过一对指向结果输入序列的开始和结束的迭代器。如果实例化 context 对象时未提供此模板参数,则默认为iteration_context_policies::load_file_to_string类型如何,此操作的时间复杂度均为 O(V + E)。
以下代码列表仅显示了所需接口,但为了简洁起见,显示了一个将给定文件加载到字符串变量中并向Wave库。
namespace boost { namespace wave { namespace iteration_context_policies { struct load_file_to_string { template <typename IterContext> class inner { public: // expose the begin and end iterators for the // included file template <typename Position> static void init_iterators(IterContext&iter_ctx, Position const &act_pos) { typedef typename IterContext::iterator_type iterator_type; std::ifstream instream(iter_ctx.filename.c_str()); if (!instream.is_open()) { CPP_THROW(preprocess_exception, bad_include_file, iter_ctx.filename, act_pos); } iter_ctx.instring = std::string( std::istreambuf_iterator<char>(instream.rdbuf()), std::istreambuf_iterator <char>()); iter_ctx.first = iterator_type(iter_ctx.instring.begin(), iter_ctx.instring.end(), PositionT(iter_ctx.filename)); iter_ctx.last = iterator_type(); } private: std::string instring; }; }; } // namespace iteration_context_policies } // namespace wave } // namespace boost
从上面的代码可以看出,一个input_policy作为wave::context对象只需要实现一个函数,即 init_iterators 函数。所示策略是通过嵌入类实现的,以避免使用模板模板参数,而该参数并非所有系统都支持。这个嵌入类应该命名为inner.
该inner类使用一个模板参数进行实例化,即迭代上下文类型,策略是该上下文类型的一部分。迭代器类型iterator_type必须通过 typedef 来获取,如所示。需要初始化的迭代器对(可访问为iter_ctx.firstanditer_ctx.last)必须从表示实际输入流的任意迭代器类型初始化。
template <typename Position> static void init_iterators( IterContext iter_ctx, Position const &act_pos);
指令在输入令牌流中被发现。此函数的主要目的是初始化一对迭代器iter_ctx.firstanditer_ctx.last,用于从预处理器引擎内部访问要插入的包含文件的相应输入流。
![]() |
![]() |
版权所有 © 2003-2011 Hartmut Kaiser
根据 Boost Software License, Version 1.0 分发。(参见附带的 LICENSE_1_0.txt 文件或访问 https://boost.ac.cn/LICENSE_1_0.txt 副本)
最后更新日期2008年10月12日星期日 20:14