什么是约束模板?

Ale*_*lex 6 c++ c++14

Herb Sutters在谈话中提到了约束模板(又名Concepts Lite):现代C++:你需要知道什么.

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

我在isocpp博客上遇到过提及已经有一个gcc的实验分支,它实现了提出Concepts Lite文档.但是,通过当前的C++ 14草案,我找不到任何提示,这是否已经成为其中的一部分C++14.

所以问题很简单:

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

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

Cas*_*sey 3

Concepts Lite 是 C++ 完整概念设计的“约束”部分。N3701“Concepts Lite”对此进行了详细描述。第 2 章是一个简短的教程,快速介绍了核心原理及其应用,这对于那些不想读完所有 56 页的人来说非常有用。

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

有几种不同的约束语法变体。Herb 在演讲中使用的代码示例:

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

被称为“简洁语法”,因为它是详细语法的较短等效形式:

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

它们都表明函数模板mean可以用任何模拟该概念的类型来实例化Sequence。为了简单起见,我们假设的要求Sequence只是我们的实现所mean需要的:(a)返回迭代器的成员begin& ,以及 (b)返回某个整型类型的成员函数。我们可以将这个概念定义为:endsize

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

Integral假设、InputIterator和的直接定义Same。这个概念定义确保,对于被测试t类型的某些发明值:T

  • t.size()是一个有效的表达式,它返回一个模拟该Integral概念的类型。
  • t.begin()是有效的,并返回一个模拟 的类型InputIterator
  • 对于 也一样t.end()
  • InputIteratorby 返回的类型t.begin()与 所返回的类型相同t.end()