概念返回类型要求语法二对一模板参数

2024-02-17

我想知道如何std::same_as的定义以及我们如何在概念或需求中使用它。

Example:

void f1() { } 
bool f2() { return true; }

template < typename T>
void Do( T func )
{
    if constexpr ( requires { { func() } -> std::same_as<bool>; } ) 
    {   
        std::cout << "Func returns bool " << std::endl;
    }   

    if constexpr ( requires { { func() } -> std::same_as<void>; } ) 
    {   
        std::cout << "Func returns void " << std::endl;
    }   
}

int main()
{
    Do( f1 );
    Do( f2 );
}

这按预期工作。

但如果我看一下定义std::same_as https://en.cppreference.com/w/cpp/concepts/same_as我找到了一个可能的实现:

namespace detail {
    template< class T, class U >
    concept SameHelper = std::is_same_v<T, U>;
}
 
template< class T, class U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

让我好奇的是我看到两个模板参数T and U在这种情况下,我们只需要写一个像{ { func() } -> std::same_as<bool>; }.

是某种magic that a { { func() } -> std::same_as<bool>; }将被转换为std::same_as<magic_return_type, bool>在这种情况下?


A concept一般类似于constexpr inline bool变量模板。然而,它确实有特殊的属性。对于这个问题,一个concept第一个模板参数是类型是一种特殊的概念:“类型概念”。

在某些位置,可以在没有第一个模板参数的情况下使用类型概念。在这些地方,第一个参数将根据它的使用方式推断出来。

在复合要求中requires表达式,类型概念是紧随其后的->. 概念的第一个参数将由表达式 E 中的类型填充{},仿佛通过decltype((E)) https://timsong-cpp.github.io/cppwp/n4861/expr.prim.req.compound#1.3.2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

概念返回类型要求语法二对一模板参数 的相关文章

随机推荐

  • Devise 在更改密码后注销用户

    我正在使用设备 当用户更改密码时 网站会将其注销 我在网上读到添加sign in可以解决问题 但不起作用 并且当密码更改时用户会被注销 这是我的代码 if user errors base empty and user update att
  • 如何在.NET 6 上的程序文件中使用启动类?

    我正在开发 ASP NET Core 2 2 Web 应用程序 将我的应用程序升级到 NET 6 时遇到一些问题 我的问题是没有startup NET 6 0 中的类 我发现program cs仅文件 我在网络应用程序中添加了启动类 但我不
  • 如何更改根视图控制器

    I want to change the rootViewController after the authenticationViewController IBAction LoginButtonPushed id sender if V
  • 在 SQLite 中启用外键约束

    我将 SQLite 与 C 结合使用 并定义了一些定义了外键的表 现在 我知道默认情况下 SQLite 中不强制执行外键约束 但我想将它们打开 是否可以通过代码来做到这一点 我查了相关的question https stackoverflo
  • Rust 中可以使用全局变量吗?

    我知道一般来说 应该避免使用全局变量 尽管如此 我认为从实际意义上来说 有时需要使用它们 在变量是程序不可或缺的情况下 为了学习 Rust 我目前正在使用 sqlite3 和 GitHub 上的 Rust sqlite3 包编写一个数据库测
  • ADB 驱动程序和 Windows 8.1

    我浪费了很多时间试图在 Windows 8 1 中为我的平板电脑成功安装 ADB 驱动程序 所以在这里我将发布我所做的 以防有人遇到同样的问题 UPDATE 发布图片 英文版 https ivanrf com en adb driver a
  • 实时服务器未加载 css 文件

    我有一个与我的 html 文件链接的 css 文件 通过实时服务器加载 html 文件时 我的 css 不起作用 直接通过浏览器打开html文件时 css工作正常 我的 css 文件位于 html 文件所在的目录之外 当我的 npm 脚本使
  • 输入密码时隐藏/替换 (C#)

    好的 我是 C 新手 但已经学到了一些东西 但我有一个问题 如何用 替换在控制台中输入的字符或完全隐藏它们 var pw eric123 Console WriteLine Password var value Console ReadLi
  • Fabric 插件:存档打包错误:-6 重新签名应用程序以进行分发时出错

    当我尝试使用 Fabric 插件上传新版本时 出现以下错误 存档打包错误 6重新签署分发应用程序时出错 usr bin codesign sign 937558639C8878BB6E161112505FA2965804A6AE all a
  • Python-解析字符串并将其转换为时间戳[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有下一种格式的字符串 2017 02 14T09 51 46 000 0600 解析字符串并将其转换为时间戳的最佳方法是什么 我可以选择使用正
  • 是否可以克隆 .NET 流?

    我们可以克隆 Stream 吗 不 流通常引用某种类型的本地资源 套接字 文件句柄等 因此它们无法被克隆或序列化 此外 许多流是只进的 不支持查找 因此您甚至可能无法从流中重新读取 不过 您可以从可读流中将其复制到可以作为字节数组移动的 M
  • 如何将表达式树保存为新的可执行磁盘文件的主入口点?

    我正在尝试将表达式树导出到 PE 程序集作为主要入口点 我通过构建表达式树获得了 Lambda 表达式 例如 using System Linq using System 1 use expression trees to create a
  • UIColor(named:) 在 iOS 11.0-11.2 上始终返回 nil

    我有一个类从我的自定义调色板返回 UIColor 我以编程方式调用它 但当我在 iOS 11 上测试它时 它总是返回一个nil结果 我在多个设备和操作系统版本 11 0 11 0 1 11 2 上尝试过此操作 所有这些都返回nil 但一旦我
  • 函数头部的 JavaScript 变量声明

    有人告诉我 javascript 变量应该全部出现在函数中使用之前 例如 function contrived var myA myB myA 10 myB 20 return myA myB 优先于 function furtherCon
  • Linux shell脚本分隔符

    如何使用 Linux 命令将 txt 文件中的分隔符从当前逗号 更改为分号 这是我的 ME 1384 DataWarehouse txt 文件 Data Warehouse ME 1384 Budget for HW SVC 13 05 2
  • 使用 PHP 准备 SVG 文件以在 img 标签数据 uri 中使用

    我正在使用 PHP 我想使用 file get contents 获取 svg 文件 并将其转换为图像标签中的数据 uri 沿着这些思路 控制器 mylogo file get contents FCPATH app views email
  • git svn clone 除了特定文件夹

    我想 git 克隆一个 svn 存储库 除了 svn 根文件夹中的一个文件夹 我该怎么做 我可以git svn clone svnrepo dir sb dir 如果我只需要sb dir但我需要其中的所有文件夹 和文件 dir除了desig
  • 使用numpy在python中向量化空间距离

    我在 python 中有一个 numpy 数组 其中包含大量 10k 3D 顶点 坐标为 x y z 的向量 我需要计算这些点的所有可能对之间的距离 使用 scipy 很容易做到 import scipy D spdist cdist ve
  • Visual Studio:如何在 IntelliSense 中显示重载?

    编写代码后 我知道查看方法重载的唯一方法是通过删除括号来实际编辑方法 并重新打开它们 是否有一个快捷键可以让我按下来激活它 而不必编辑我的文件 例如 请参考显示对话框重载屏幕截图如下 With your cursor inside the
  • 概念返回类型要求语法二对一模板参数

    我想知道如何std same as的定义以及我们如何在概念或需求中使用它 Example void f1 bool f2 return true template lt typename T gt void Do T func if con