c++ - 何时在 C++20 中使用约束实现模板

标签 c++ templates constraints c++20 c++-concepts

关闭。这个问题需要更多 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/

    相关文章:

    c++ - 链接器实际上如何处理多重定义的 `inline` 函数?

    c++ - 模板模板时强制特定重载

    sql - 跨多列排列的唯一约束

    regex - ASP.NET MVC 正则表达式路由约束

    c++ - 从 std::istreambuf_iterator<> 复制到 std::vector<>

    c++ - CMake "project"指令的正确用法是什么

    c++ - 欧拉计划 3(性能)

    c++ - 针对 C++ 类型测试 opencv mat 数据类型的最佳方法是什么?

    c++ - 在不创建参数对象的情况下解析 constexpr 函数

    swift - 以编程方式更新约束?