C++ 什么是约束模板?

C++ 什么是约束模板?,c++,c++14,C++,C++14,Herb Sutters在演讲中提到了受约束的模板(又称概念精简版) 我知道boost有一个很长时间的概念包,当模板推断机制找不到操作符、函数或访问冲突模式时,它可以很好地打印错误消息 我在上遇到过这样的情况,即已经有了一个实验分支来实现。然而,通过查看当前版本,我找不到任何提示,这是否已经是C++14的一部分 所以问题很简单: Lite概念会成为C++14的一部分吗?(首选标准中的参考。我找不到,而且我对标准不是很熟悉。) 它的正确语法是什么?(Herb的提案和幻灯片在这里有分歧,我不知道哪

Herb Sutters在演讲中提到了受约束的模板(又称概念精简版)

我知道boost有一个很长时间的概念包,当模板推断机制找不到操作符、函数或访问冲突模式时,它可以很好地打印错误消息

我在上遇到过这样的情况,即已经有了一个实验分支来实现。然而,通过查看当前版本,我找不到任何提示,这是否已经是
C++14
的一部分

所以问题很简单:

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

<强>注:< /强>如果您等待得足够长,我会尝试让GCC分支运行,并且至少可以说关于实验实现的任何东西,但是这并不意味着语法的正确性。

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

概念Lite将不是C++14的一部分,它将在今年晚些时候作为单独的技术规范发布。TS措辞的最新草稿为

有几种不同的约束语法变体。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();
}
假设
积分
输入计数器
,和
相同
的直接定义。该概念定义确保,对于正在测试的
t
类型的一些发明值
t

  • t.size()
    是一个有效的表达式,它返回一个对
    积分概念建模的类型
  • t.begin()
    有效,并返回一个对
    InputIterator
    建模的类型
  • 同样适用于
    t.end()
  • t.begin()
    返回的
    inputierator
    与由
    t.end()
    返回的类型相同

Lite概念会成为C++14的一部分吗?(标准中的参考首选什么?目前还没有C++14标准。无论如何,不,它们不会出现在C++14中。我会尝试找到一些参考/讨论。解释得很好。这并不是说这个问题不合法,不是每个人都想读30页。它们最终会成为C++14的TR。不确定这些信息有多新,虽然ugh.也看到它不会出现在C++14标准中,而是一个附录(技术报告)。取决于你如何定义“标准”,它是否是它的一部分。根据Hmmm isocpp.org,TRs不是规范性的,它将是TS,看到这将是规范性的。。
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())>();
  }
}