调用较少约束的功能等效函数

2023-12-09

考虑以下代码:

#include <iostream>
#include <type_traits>

struct A;

template<class T>
concept HasParent = std::is_convertible_v<typename T::parent*, A*>;

struct A{};

struct B : A { using parent = A; };

template<class T>       int foo(T*) { return 1; }

template<HasParent T>   int foo(T*)
{
  // call the other one?
  return 2;
}

int main()
{
  B b;
  std::cout << foo(&b) << std::endl; // displays 2
  return 0;
}

可以打电话给将军吗foo<T>(T*)函数来自foo<HasParent T>(T*)?

(这是一个(功能)示例,但我可以在 github 上链接完整的代码)


可以打电话给将军吗foo<T>(T*)函数来自foo<HasParent T>(T*)?

你需要some方法来区分这两个函数以实现此目的。

例如:

template <typename T>               void foo(T);
template <typename T> requires true auto foo(T) -> int;

对于所有人来说,第二个显然比第一个受到更多限制T, so foo(42)呼叫第二个。但是你can区分两者:

auto unconstrained = static_cast<void(*)(int)>(foo);

这里,约束函数模板返回int所以它不是一个可行的候选者,我们得到了不受约束的候选者。

在您的示例中,两者都返回int,所以这个特殊的技巧不起作用。但关键是你需要some区分这两个模板的方法。

更好的方法可能是:

template <typename T, std::monostate M = {}>
void foo(T);

template <typename T> requires true
void foo(T arg) {
    foo<T, std::monostate{}>(arg); // calls the unconstrained one
}

Using monostate这有点可爱,因为它实际上并没有改变模板实例化的数量(只有一个monostate... ). foo(42)调用第二个,第二个调用第一个。Demo.

但最好只添加一个新函数,并让函数模板的无约束和约束版本都调用该函数(从某种意义上说,它可能比monostate方法)。

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

调用较少约束的功能等效函数 的相关文章

随机推荐

  • 如何使用 GitHub API?

    当它告诉我使用时 我不确定这意味着什么 GET repos owner repo commits sha 我如何使用该 API 调用来检索我正在查找的信息 GET repos owner repo commits sha GET是用于调用此
  • 绕特定点旋转(例如,绕0,0,0旋转)

    我一直在这个问题上进行了很多搜索 但我找不到真正合适的答案 我需要围绕给定点 例如 0 0 0 旋转圆柱体 但圆柱体的枢轴是默认给定的 我该如何改变它 I found this主题 这正是我想做的 但我不知道如何用 java 来做 为了更好
  • 列出实现接口的类的所有属性

    我有一个带有接口的类 TInterface interface IXMLNode function Get One Boolean function Get Two Boolean function Get Three Boolean pr
  • php - 我应该在调用 Location: header 之后调用 exit() 吗? [复制]

    这个问题在这里已经有答案了 调用重定向函数头后 是否应该调用 exit 谢谢 你绝对应该 单独设置标头不会终止脚本执行
  • 在 .NET C# 中存储加密密钥的最佳方法

    在我们的应用程序中 我们有很多敏感的配置设置 我们将它们存储在再次加密的 xml 文件中 该安全文件必须在运行时解密并读取配置值 但是出现了一个问题 密钥和初始化向量是硬编码在代码中的 因此任何人都可以使用 Reflector 读取它 在
  • 使用java从服务器(ServerSocket)读取客户端(客户端Socket)上的字节包

    我是新人 我是一名 Java 开发人员 新手 目前我正在从事 BSE 项目 我面临着从服务器 服务器套接字 读取客户端 客户端套接字 上的字节包的问题 如果你能帮助我 请帮助我 提前致谢 好吧 如果你想直接与数据包交互 那么你需要使用Dat
  • 如何从User字段LookupId获取用户

    我在 sharepoint 在线有一个列表 在这个列表中 我有一个人员字段 当我调用 API 端点来获取列表中的所有项目时 我获得了 person 字段的 LookupId 值 我尝试使用lookupid的值来获取用户 但它不起作用 因为该
  • 为什么 Hibernate 会忽略 package-info.java?

    我正在尝试在包级别上使用 Hibernate TypeDef 注释 正如它所描述的那样休眠文档 我在用着Hibernate 3 6 and Spring 3 0 7 代码编译并显示package info class位于类路径中 但 Hib
  • 我们究竟如何计算时间戳差异?

    我们将时间戳作为姿势 图片和点数据的双精度值 它们并不总是对齐 如何计算两个时间戳之间的时间距离 是的 我知道如何减去两个双精度数 但我完全不确定增量如何与时间相对应 我有一些有趣的时间戳数据可以阐明您的问题 但没有准确回答它 我一直在尝试
  • MySQL BIGINT(20) 与 Varchar(31) 性能对比

    我读过 像 23423423423423423637 这样的 bigint 作为 primare 唯一键比像 961637593864109 412954765521130 这样的 varchar 更好 但是how当有 100 万行时 我永
  • twig 继承和 symfony2 控制器变量

    我正在尝试使用 symfony2 twig 进行我的第一个项目 我使用定义的块创建了基本的树枝模板 它基本上看起来像这样 block content some content endblock block footer footer con
  • angularJS:用于溢出文本和性能的 dotdotdot

    我是 angularJS 的新手 也许写了一些不好的东西 但我怎样才能正确实现这个插件 https github com BeSite jQuery dotdotdot 在我的桌子上吗 现在用我的代码我的编辑表单和表格真的不太快 真的太慢
  • 使用 Google App Engine for Java 出现 ClassNotFoundException

    我和一个朋友正在使用 Java SDK 涉足 App Engine 我们已经 毫无问题地组合一个 Hello World 示例 然而 当 我们尝试添加代码以使用以下方式对 Web 服务进行简单调用 com google api client
  • 使用 libpqxx 库插入 NULL/空字符串

    在下面的代码片段中 名为 mac 的 std string 对象有时是一个空字符串 即 我希望准备好的语句自动将此变量视为 null 我想知道如何在下面的代码中实现这一点 在我的谷歌搜索尝试中 我碰巧发现有一种方法可以设置指示空值的标志 但
  • 使用包含 @ 的密码使用 PHP 连接到 FTP

    我有以下问题 我需要连接到 FTP 并读取一个 CSV 文件 主要问题是它的密码有 我如何连接特殊字符 我尝试了以下几种连接方式 文件打开 filename ftp user p s email protected file csv han
  • 更改子类模型表中的列顺序

    在 peewee 中有一个子类化模型的情况下 如何告诉 peewee 在表中创建列的顺序 在下面的例子中 顺序是 b c a 但我想要 a b c class BaseModel Model b CharField c CharField
  • 从 MS Access 执行 SQL Server 存储过程

    我使用 MS Access 2013 和 SQL Server 2012 我已将 SQL Server 数据库连接到 MS Access 我通过 SQL Server 身份验证连接到 SQL Server 我想执行一个存储过程 并将值输入到
  • 如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

    我正在使用 jq 解析 JSON 文件 如图所示here 但是 字符串值的结果包含预期的 双引号 如下所示 cat json txt jq name Google 如何将其传递到另一个命令中以删除 所以我得到 cat json txt jq
  • 如何让Perl crypt加密超过8个字符?

    Perl 时仅对前 8 个字符进行加密crypt使用函数 有没有办法让它使用更多字符 举个例子 crypted password crypt PassWord SALT and crypted password crypt PassWord
  • 调用较少约束的功能等效函数

    考虑以下代码 include