【问题标题】:What are constrained templates?什么是约束模板?
【发布时间】:2014-04-04 21:13:16
【问题描述】:

Herb Sutters 在演讲中提到了受限模板(又名 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的slides有分歧,不知道哪一个更新)
  • 您能否举一个约束(谓词)和受约束模板的最小示例?

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

【问题讨论】:

标签: c++ c++14


【解决方案1】:

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)返回迭代器的成员beginend,以及(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() 也一样。
  • t.begin() 返回的InputIteratort.end() 返回的类型相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多