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
的一部分。
所以问题很简单:
注意:如果等待的时间足够长,我会尝试让gcc分支运行,并且至少可以说实验性实现,但这并不意味着语法的正确性
答案 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())>();
}
}
假设Integral
,InputIterator
和Same
的直接定义。对于正在测试的t
类型的某些发明值T
,此概念定义可确保:
t.size()
是一个有效的表达式,它返回一个模拟Integral
概念的类型。t.begin()
有效,并返回模拟InputIterator
。t.end()
相同。InputIterator
返回的t.begin()
与t.end()
返回的{{1}}类型相同。