什么是约束模板?

时间:2014-04-04 21:13:17

标签: c++ c++14

Herb Sutters在演讲中提到了约束模板(a.k.a. Concepts Lite)。Modern C++: What You Need to Know

我知道boost有一个概念包已经存在多年了,当模板推导机制无法找到运算符,函数或具有访问冲突模式时,它允许一个非常好的打印错误消息。

我在isocpp blog上遇到提及gcc实施document proposing Concepts Lite的实验分支。不过,通过查看当前的C++14 draft,我无法找到任何提示是否已成为C++14的一部分。

所以问题很简单:

  • Concepts Lite是C ++ 14的一部分吗? (参考标准首选。我找不到一个,我对标准不是很熟悉。)
  • 它的正确语法是什么? (Herb的提案和幻灯片在这里分歧,我不知道哪一个更新)
  • 你能给出一个约束(谓词)和约束模板的最小例子吗?

注意:如果等待的时间足够长,我会尝试让gcc分支运行,并且至少可以说实验性实现,但这并不意味着语法的正确性

1 个答案:

答案 0 :(得分:3)

Concepts Lite是C ++完整概念设计的“约束”部分。它在N3701 "Concepts Lite"中有详细描述。第2章是一个简短的教程,可以快速浏览核心原则及其应用程序,非常适合那些不想阅读所有56页的人。

Concepts Lite不会成为C ++ 14的一部分,它将在今年晚些时候作为单独的技术规范发布。 TS措辞的最新草案是N3929 "Concepts Lite Specification"

有一些不同的约束语法变体。 Herb在谈话中使用的代码示例:

auto mean(const Sequence& seq) {
  auto n = 0.0;
  for (auto x : seq)
    n += x;
  return n / seq.size();
}

被称为“简洁语法”,因为它与详细语法的等效时间更短:

template <typename __T>
  requires Sequence<__T>()
auto mean(const __T& seq) {
  auto n = 0.0;
  for (auto x : seq)
    n += x;
  return n / seq.size();
}

它们都表明函数模板mean可以使用任何模型Sequence概念的类型进行实例化。为简单起见,我们假设Sequence的要求仅是我们mean所需的实现:(a)成员begin&amp;返回迭代器的end和(b)返回某种整数类型的成员函数size。我们可以将概念定义为:

template <typename T>
concept bool Sequence() {
  return requires(T t) {
    {t.size()} -> Integral;
    {t.begin()} -> InputIterator;
    {t.end()} -> InputIterator;
    requires Same<decltype(t.begin()), decltype(t.end())>();
  }
}

假设IntegralInputIteratorSame的直接定义。对于正在测试的t类型的某些发明值T,此概念定义可确保:

  • t.size()是一个有效的表达式,它返回一个模拟Integral概念的类型。
  • t.begin()有效,并返回模拟InputIterator
  • 的类型
  • t.end()相同。
  • InputIterator返回的t.begin()t.end()返回的{{1}}类型相同。