Boost C++ 库

……在世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

概念 - Boost C++ 函数库
PrevUpHomeNext

概念

定义

表 2.13. 符号

F 符合查找器概念的类型
Fmt 符合格式化器概念的类型
Iter 迭代器类型 (Iterator Type)
f 类型为 F 的对象
fmt 类型为 Fmt 的对象
i,j 类型为 Iter 的对象

查找器概念 (Finder Concept)

查找器是一个仿函数,用于搜索容器中的任意部分。搜索结果是一个 iterator_range,表示选定的部分。

表 2.14. 有效表达式

表达式 返回类型 效果
f(i,j) 可转换为 iterator_range<Iter> 在区间 [i,j) 上执行搜索并返回搜索结果

各种算法需要在一个容器中执行搜索,而查找器是这类搜索操作的泛化,它允许算法从搜索中抽象出来。例如,通用的替换算法可以替换输入的任意部分,而查找器用于选择所需的部分。

请注意,只要求查找器能够处理特定的迭代器类型。但是,查找器操作可以定义为模板,从而允许查找器处理任何迭代器。

示例

  • 以类的方式实现的查找器。此查找器始终返回整个输入作为匹配项。operator() 是模板化的,因此查找器可以用于任何迭代器类型。
    struct simple_finder
    {
        template<typename ForwardIteratorT>
        boost::iterator_range<ForwardIteratorT> operator()(
            ForwardIteratorT Begin,
            ForwardIteratorT End )
        {
            return boost::make_range( Begin, End );
        }
    };
            
  • 函数查找器。查找器可以是任何函数对象。也就是说,任何具有所需签名的普通函数也可以用作查找器。但是,这样的函数只能用于特定的迭代器类型。
    boost::iterator_range<std::string> simple_finder(
        std::string::const_iterator Begin,
        std::string::const_iterator End )
    {
        return boost::make_range( Begin, End );
    }
            

格式化器概念 (Formatter concept)

格式化器由 替换算法 使用。它们与查找器紧密结合使用。格式化器是一个仿函数,它接收查找器操作的结果并以特定方式对其进行转换。格式化器的操作可以使用由特定查找器提供的附加信息,例如 regex_formatter() 使用来自 regex_finder() 的匹配信息来格式化格式化器操作的结果。

表 2.15. 有效表达式

表达式 返回类型 效果
fmt(f(i,j)) 可以通过容器特性访问的容器类型 格式化查找器操作的结果

与查找器类似,格式化器泛化了格式化操作。当使用查找器选择输入的一部分时,格式化器会接收该选择并对其执行一些格式化。算法可以使用格式化器来抽象格式化。

示例

  • 以类的方式实现的格式化器。此格式化器不执行任何格式化,而是将匹配项重新打包后返回。operator() 是模板化的,因此格式化器可以用于任何查找器类型。
    struct simple_formatter
    {
        template<typename FindResultT>
        std::string operator()( const FindResultT& Match )
        {
            std::string Temp( Match.begin(), Match.end() );
            return Temp;
        }
    };
                    
  • 函数格式化器。与查找器类似,格式化器可以是任何函数对象。但是,作为函数,它只能与特定的查找器类型一起使用。
    std::string simple_formatter( boost::iterator_range<std::string::const_iterator>& Match )
    {
        std::string Temp( Match.begin(), Match.end() );
        return Temp;
    }
                        


PrevUpHomeNext