关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
1年前关闭。
Improve this question
我试图找出何时应该使用 C++20 模板约束。
目前我只使用约束来消除模板重载的歧义。
然而,还有更多的模板没有被重载。几乎所有这些都对模板类型的特性有隐含的期望。
作为一个例子,我们假设一个函数模板隐式地期望一个容器类型并通过调用 T::size()
来访问该容器。方法和使用T::operator[]
运算符(operator)。
如果传递的类型不提供 T::size()
,通常会出现编译错误。方法和/或T::operator[]
.我仍然可以添加显式约束来表达所需的功能。
在哪些情况下依赖隐式编译错误而不是显式约束可能是致命的?除了将约束用作文档的一部分之外,显式约束相对于隐式要求有哪些优势?
最佳答案
实际上,具有概念的 C++ 代码中的趋势是要么具有旨在通过参数相关名称查找找到的重载约束函数,要么具有约束调用运算符的仿函数。
没有不受约束的模板自由函数 (*)。道德最终可能会导致没有不应该重载的自由功能。
所有不受约束且不应重载的模板函数最好由仿函数对象替换。我认为有 3 个原因:
最后,范围库更进一步。对于每个应该被客户端重载的函数,库声明并使用仿函数对象来检查将被调用的重载是否满足所有重载都应该满足的某些约束。例如
std::range::begin
.在库中,这些仿函数称为定制点对象。这可能是最安全的方法,但它的实现相当冗长。(*) 请参阅下面的 Davis Herring 评论,了解特殊情况下不能选择仿函数对象。
关于c++ - 何时在 C++20 中使用约束实现模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61972437/