在通用编程/ TMP世界中,究竟什么是模型/策略和"概念"?

Has*_*yed 6 c++ templates components metaprogramming generic-programming

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

  1. 显示一个简单的代码片段,以显示概念/技术的用途和方式.
  2. 要简单易懂,以便没有接触过这个区域的程序员能够掌握它.

注意:

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

- 发布接受编辑 -

Boost有一篇关于泛型编程概念的好文章

Pet*_*der 8

一个概念是一组对类型的要求.例如,您可以使用一个名为"RandomAccessible"的概念,该概念将需求放在它operator[](int)在O(1)时间内实现的类型上.

随着概念从即将推出的C++标准中删除,它们仅作为文档在C++中无形地存在.例如,您可以阅读SGI对Container概念的描述.

当类型满足概念的所有要求时,您将其称为该概念的模型.例如,std::vector是Container概念的模型(或者,等效地,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
  }
};
Run Code Online (Sandbox Code Playgroud)

用法如下:

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];
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,在这个例子中,我们可以说,fixed_storagedynamic_storage是的"模型" StoragePolicy的概念.当然,我们需要正式定义StoragePolicy其模型所需的概念.在这种情况下,它只是定义一个可索引的data成员变量.