c++ - 在通用编程/TMP 世界中,模型/策略和 "concept"究竟是什么?

标签 c++ templates components metaprogramming generic-programming

我想在一处了解这三个概念的精确而简洁的定义。答案的好坏应该取决于以下两点。

  1. 展示一个简单的代码片段来展示这个概念/技术的用途和用途。
  2. 足够简单易懂,以便没有接触过该领域的程序员也能掌握。

注意:

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

-- 发布接受编辑--

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

最佳答案

概念 是对一种类型的一组要求。例如,您可以有一个名为“RandomAccessible”的概念,它要求在 O(1) 时间内实现 operator[](int) 的类型。

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

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

最后,策略 是一个行为单元,它可以与其他行为单元组合以构建复杂的类。例如,假设您想构建两个类:一个固定大小的数组和一个可动态调整大小的数组。这两个类都有很多共享功能,但它们的存储机制和某些功能不同(例如,您不能在固定大小的数组上调用 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_storagedynamic_storageStoragePolicy 概念的“模型”。当然,我们需要正式定义 StoragePolicy 概念对其模型的要求。在这种情况下,只需定义一个可索引的 data 成员变量。

关于c++ - 在通用编程/TMP 世界中,模型/策略和 "concept"究竟是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2213664/

相关文章:

c++ - 严格别名警告,创建 uint32_t 对无符号字符数组 + 偏移量的引用

c++ - 什么时候使用引用比指针更好?

javascript - Joomla - 如何使用用户在模板参数中提供的信息从头部取消设置 JS 文件

c++ - 使用模板化节点的模板化列表类中缺少类型说明符

javascript - 使用 QtWebEngine 在 Qt 中将 C++ 对象暴露给 Javascript

c++ - 概念 : How are declarations linked to apropriate definitions

c++ - double /整数模板函数的 vector

javascript - angular 1.5 - 单向数据流 - parent 只在第一次更新子原始值,一次性?

angularjs - 将特定服务实例注入(inject)一个父组件中一个组件的多个实例

angular - 是否可以从 formcontrol 中获取 minlength 值?