gpt4 book ai didi

c++ - 什么是受限模板?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:46 24 4
gpt4 key购买 nike

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 的幻灯片在这里有分歧,我不知道哪个更最新)
  • 您能给出一个约束(谓词)和约束模板的最小示例吗?

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

最佳答案

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 & 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() 也是如此。
  • t.begin() 返回的InputIteratort.end() 返回的类型相同。

关于c++ - 什么是受限模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com