Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在通用编程/TMP世界中,模型/a策略和“a”究竟是什么;概念;?_C++_Templates_Components_Metaprogramming_Generic Programming - Fatal编程技术网

C++ 在通用编程/TMP世界中,模型/a策略和“a”究竟是什么;概念;?

C++ 在通用编程/TMP世界中,模型/a策略和“a”究竟是什么;概念;?,c++,templates,components,metaprogramming,generic-programming,C++,Templates,Components,Metaprogramming,Generic Programming,我想在一个地方知道这三个概念的精确而简洁的定义。答案的质量取决于以下两点 显示一个简单的代码片段,以显示如何以及如何使用该概念/技术 要简单易懂,这样一个没有接触过这个领域的程序员就可以掌握它 注意: 可能有许多正确的答案,因为每个概念都有许多不同的方面。如果有很多好的答案,我最终会把这个问题转化为CW并汇总答案 --后接受编辑-- Boost对泛型编程概念有很好的理解概念是一组需求,类型必须满足这些需求才能对概念进行建模 例如,如果对于类型为T的一对对象a和b,表达式a

我想在一个地方知道这三个概念的精确而简洁的定义。答案的质量取决于以下两点

  • 显示一个简单的代码片段,以显示如何以及如何使用该概念/技术
  • 要简单易懂,这样一个没有接触过这个领域的程序员就可以掌握它 注意:

    可能有许多正确的答案,因为每个概念都有许多不同的方面。如果有很多好的答案,我最终会把这个问题转化为CW并汇总答案

    --后接受编辑--


    Boost对泛型编程概念有很好的理解

    概念是一组需求,类型必须满足这些需求才能对概念进行建模

    例如,如果对于类型为
    T
    的一对对象
    a
    b
    ,表达式
    a
    格式良好,可转换为
    bool
    ,并产生严格的弱序关系,则类型
    T
    的可比性
    。类型
    int
    lessthanCompariable
    模型的一个示例

    概念可以形成细化层次结构。如果
    A
    的要求是
    B
    要求的超集,则概念
    A
    是概念
    B
    的细化。例如,是对的细化

    概念用于限制模板可以专用的类型集。例如,
    std::sort
    算法可以接受一对对象,只要它们建模

    std::向量向量向量机;
    std::列表;
    //好的,std::vector::iterator是“RandomAccessIterator”的一个模型。
    排序(vec.begin(),vec.end());
    //错误,std::list::iterator只是'BidirectionalIterator'的一个模型。
    排序(list.begin(),list.end());
    

    <>注意,概念是C++标准和各种其他文档中使用的非正式对象。该语言不直接支持概念()。

    A.o.SGI文档中提到的“模型”指的是C++0x提案中引入的“概念”:它是编译时,相当于OO建模中的“接口”。它总结了通用代码对模板参数的要求

    例如,您可以说
    std::transform
    函数的
    outputierator
    参数应该实现
    operator++()
    operator=(T)
    ,以便函数工作


    策略是另一回事:它使算法可以从外部改变。一个很好的例子是stl容器中使用较少的
    分配器
    参数:它告诉算法如何分配内存。如果愿意,可以制作一个
    std::vector
    ,其中整个
    vector
    函数将在云中而不是堆中分配内存。(注意,我不太适合实现这个分配器)。

    概念是一个类型上的一组需求。例如,您可以有一个名为“RandomAccessible”的概念,它将需求放在一个类型上,该类型在O(1)时间内实现
    操作符[](int)

    由于概念从现有的C++标准中删除,它们只作为C++文档存在于C++中。例如,你可以阅读

    当一个类型满足一个概念的所有要求时,您称它为该概念的模型。例如,
    std::vector
    是容器概念的一个模型(或者,等效地,
    std::vector
    “模型”容器)

    最后,策略是一个行为单元,它可以与其他行为单元结合起来构建复杂的类。例如,假设您想要构建两个类:一个固定大小的数组和一个动态调整大小的数组。这两个类都有很多共享功能,但只是它们的存储机制和一些功能有所不同(例如,在固定大小的数组上不能调用
    push_back

    模板
    类数组:公共存储策略
    {
    公众:
    T&运算符[](int i){返回数据[i];}
    };
    模板
    类固定存储
    {
    T数据[N];
    };
    模板
    类动态存储
    {
    T*数据;
    公众:
    无效推回(常数T和值)
    {
    //动态数组插入代码
    }
    };
    
    用法如下:

    int main()
    {
      array<int, fixed_storage<int, 10> > fixed_array;
      array<int, dynamic_storage<int> > dynamic_array;
    
      dynamic_array.push_back(1);
      fixed_array[9] = dynamic_array[0];
    }
    
    intmain()
    {
    固定阵列;
    动态数组;
    动态_数组。向后推_(1);
    固定数组[9]=动态数组[0];
    }
    
    显然,这是一个非常粗糙和不完整的例子,但我希望它能阐明政策背后的概念

    注意,在示例中,我们可以说
    固定存储
    动态存储
    存储策略
    概念的“模型”。当然,我们需要正式定义
    StoragePolicy
    概念对其模型的要求。在这种情况下,只需定义一个可索引的
    data
    成员变量即可

    template <class T, class StoragePolicy>
    class array : public StoragePolicy
    {
    public:
      T& operator[](int i) { return data[i]; }
    };
    
    template <class T, int N>
    class fixed_storage
    {
      T data[N];
    };
    
    template <class T>
    class dynamic_storage
    {
      T* data;
    
    public:
      void push_back(const T& value) 
      {
        // Code for dynamic array insertion
      }
    };
    
    int main()
    {
      array<int, fixed_storage<int, 10> > fixed_array;
      array<int, dynamic_storage<int> > dynamic_array;
    
      dynamic_array.push_back(1);
      fixed_array[9] = dynamic_array[0];
    }