代码之家  ›  专栏  ›  技术社区  ›  Hassan Syed

在通用编程/TMP世界中,模型/策略和“概念”到底是什么?

  •  6
  • Hassan Syed  · 技术社区  · 14 年前

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

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

    注:

    有很多很好的答案,我最终会把这个问题转化为CW并汇总答案。

    --后接受编辑--

    Boost有一个很好的 article 关于泛型编程概念

    3 回复  |  直到 14 年前
        1
  •  8
  •   Peter Alexander    14 年前

    A. 概念 是类型上的一组要求。例如,您可以有一个称为“RandomAccessible”的概念,它将需求放在它实现的类型上 operator[](int)

    由于概念从即将到来的C++标准中删除,它们在C++中作为文档只存在无形的。例如,你可以阅读 SGI's description of the Container concept

    模型 这是一个概念。例如 std::vector 是容器概念的模型(或者,等效地, 向量 “模型”容器)。

    push_back 在固定大小的数组上)。

    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];
    }
    

    显然,这是一个非常粗糙和不完整的例子,但我希望它能阐明政策背后的概念。

    注意,在这个例子中,我们可以这样说 fixed_storage dynamic_storage 都是中国的“样板” StoragePolicy 概念。当然,我们需要正式定义 存储策略 data 成员变量。

        2
  •  2
  •   xtofl Adam Rosenfield    14 年前

    例如,您可以说 OutputIterator 系统参数 std::transform operator++() operator=( T ) 以使功能正常工作。

    这个 政策 还有一件事:它使算法可以从外部改变。一个很好的例子是较少使用 Allocator stl容器的参数:它告诉算法如何分配内存。如果你想,你可以做一个 std::vector<int, AllocateOnCloud> ,整个 vector 函数将在云中而不是堆上分配内存(我不适合实现这个分配器(注意)。

        3
  •  2
  •   avakar    14 年前

    例如,一个类型 T LessThanComparable a b 类型 表情 a < b 结构良好,可转换为 bool int 莱斯特尚 .

    概念可以形成细化层次结构。概念 A 是对概念的提炼 B 如果符合 A. 是的需求的超集 B . 例如 BidirectionalIterator 是对 ForwardIterator .

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

    std::vector<int> vec;
    std::list<int> list;
    
    // OK, std::vector<int>::iterator is a model of `RandomAccessIterator`.
    std::sort(vec.begin(), vec.end());
    
    // error, std::list<int>::iterator is only a model of `BidirectionalIterator`.
    std::sort(list.begin(), list.end());
    

    yet ).