如何使带有转换构造函数的wrapper类在重载解析中胜过wrapper

2024-01-30

我正在尝试设计一个包装器来使用一些特殊逻辑来处理算术参数。

https://godbolt.org/z/zG959e5Pz https://godbolt.org/z/zG959e5Pz

#include <stdio.h>

template <class T>
struct wrapper {
    wrapper(const T& o): value(o) {}
    T value;
};

void func(wrapper<int> a) {
    printf("int: %d\n", a.value);
}


int main () {
    func(1); // int: 1
    func(1.0); // int: 1
}

但是,当我声明一个重载函数时func,我遇到编译错误。编译器似乎无法选择具体的重载函数。

#include <stdio.h>

template <class T>
struct wrapper {
    wrapper(const T& o): value(o) {}
    T value;
};

void func(wrapper<int> a) {
    printf("int: %d\n", a.value);
}

void func(wrapper<double> a) {
    printf("double: %.2f\n", a.value);
}

int main () {
    func(1);
    // func(1.1);
}

https://godbolt.org/z/YEo4c3E69 https://godbolt.org/z/YEo4c3E69

编译器错误

<source>: In function 'int main()':
<source>:18:9: error: call of overloaded 'func(int)' is ambiguous
   18 |     func(1);
      |     ~~~~^~~
<source>:9:6: note: candidate: 'void func(wrapper<int>)'
    9 | void func(wrapper<int> a) {
      |      ^~~~
<source>:13:6: note: candidate: 'void func(wrapper<double>)'
   13 | void func(wrapper<double> a) {
      |      ^~~~

我该如何修复它?


使构造函数成为模板,接受任何类型。然后拒绝除以下类型之外的类型T与 SFINAE 合作。这将防止调用它时隐式参数转换。

#include <concepts>

template <class T>
struct wrapper {
    template <std::same_as<T> U = T>
    wrapper(const U &o): value(o) {}
    T value;
};

或者 C++20 之前的版本:

template <class T>
struct wrapper {
    template <typename U = T, std::enable_if_t<std::is_same_v<T, U>, std::nullptr_t> = nullptr>
    wrapper(const U &o): value(o) {}
    T value;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使带有转换构造函数的wrapper类在重载解析中胜过wrapper? 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • React 测试库 - 避免 getBy?

    当使用 React 测试库测试组件时 我发现自己从getBy 有时需要将其替换为queryBy 例如 如果我需要检查某个元素是否不存在 我的测试最终混合了getBy and queryBy 我最近刚刚使用queryBy对于一切 这让我思考
  • 在 Android 中禁用声音安全级别通知

    在我的 android 应用程序中 我需要提高音量 当我提高音量时 我会收到如下通知 将音量提高到安全水平以上 长时间高音量收听可能会损害您的听力 如何禁用此功能 此限制已融入 Android 操作系统中 因此该解决方案几乎是通用的 您需要
  • 针对不同安装类型(服务器/客户端)的 Inno Setup 子选项/子组件

    我正在尝试使用服务器和客户端安装类型为我的应用程序准备设置 服务器类型很容易使用一些代码 但客户端安装也有很多选项 我正在尝试创建一个带有类型选择的页面 如果用户选择客户端安装 则还有许多其他选择 是否可以 Example Server 无
  • 如何按最大日期获取某些列的行?

    我想在列时获取最新列I and II是相同的 所以结果应该是 1 30 2017击败1 27 2017 I I III IV A X 1 30 2017 9 33 00 AM some data A Y 1 30 2017 9 33 00
  • 为什么选择 MVC 而不是优秀的旧式 ASP.NET?还是不明白为什么我应该走这条路?

    我知道这个问题之前已经被问过 并且我阅读了所有答案 但他们仍然没有给我我正在寻找的答案 我需要一些具体的东西 我自愿向我们组中的其他开发人员进行 MVC 演示 这迫使我学习它 每个人都面临的一个大问题是 MVC 可以带来哪些我们在 ASP
  • android:无法停止活动

    我是安卓新手 我有一个登录活动 它验证用户编号 然后启动 搜索活动 在运行时 我看到搜索活动出现 在验证用户之后 但 Android 在停止登录活动时遇到问题 我收到 java lang runtimeException 无法停止活动 co
  • 为什么 EditorTemplate 不显示数据?

    我重写了我的页面以使用 EditorTemplates 他们非常友善 但是 当我回发时 仅第一行回发数据 其他 4 行显示为空 FormSection 有一个 FormRowModel 列表 FormRows 有一个 CtrlInputDa
  • c中int64的十进制到十六进制

    为什么这段代码不起作用 include
  • 从命名空间到子域?

    我想要做的是将命名空间路由与子域路由相匹配 例如在我的routes rb中我有 namespace group do resources groups resources clubs end 组索引和每个组的当前路径如下 lvh me gr
  • 使用本机应用程序保护 Oauth2 中的身份验证代码 (Android)

    这个问题几乎与AppLinks assetlinks json 似乎未用于验证 https stackoverflow com questions 51327174 applinks assetlinks json appears not
  • JavaScript 这是未定义的。这应该是全局对象

    从网页加载脚本时 为什么我会在 google 开发控制台中收到以下错误 但是 如果我使用开发工具调试器单步执行代码 则不会发生错误并且 this name Jane Doe 正如预期的那样 索引 html main js use stric
  • 如何用NULL初始化结构体指针变量?

    我有这样两个结构 struct table element struct table val table val arr int count arr struct hash table struct table element table
  • 如何在不同的子域上运行 WordPress 管理员?

    我需要通过 https 运行 WordPress 管理员 我们使用 CDN 为站点提供缓存内容 但 CDN 无法接受安全流量 每个 IP 只允许一个 SSL 证书 并且我们在其上运行多个站点 我无法控制重定向httpS www mysite
  • C++ 标准:宽松的原子存储可以提升到互斥锁之上吗?

    标准中是否有任何措辞可以保证原子的宽松存储不会被提升到互斥体的锁定之上 如果不是 是否有任何措辞明确表明编译器或 CPU 这样做是合理的 例如 采用以下程序 可能会使用 acq rel 进行foo has been set并避免锁定 和 或
  • 具有不同数量对象的 WPF MVVM 视图。如何?

    你好 我想设计视图 其中包含不同位置的多个对象 例如 如果视图模型可以具有像对象列表 矩形 这样的字段 并且当我更改 添加成员到列表时 新的矩形会出现在视图上的指定位置 那就太好了 我如何创建这样的视图 视图模型 你可以有一个ICollec
  • MVC 4 全局过滤器的执行顺序是什么

    我的 MVC 4 应用程序中有 2 个全局操作过滤器 我已使用 RegisterGlobalFilters 在 Filter config 文件中注册了它们 我需要它们以特定的顺序执行 我知道如何指定控制器特定过滤器的顺序 但如何指定全局过
  • 如何在单元测试中比较两个对象?

    public class Student public string Name get set public int ID get set var st1 new Student ID 20 Name ligaoren var st2 ne
  • 使用 Selenium Python 绑定读取 div 中的隐藏值

    Issue 如何读取嵌套中的值 div 情况 我正在我们的网站上测试注册 为了完成该过程 用户需要输入验证码 使用帮助程序类 在我们的开发服务器上 我们可以显示 隐藏 当前的验证码 我需要抓住它并保存它以供 send keys 函数使用 该
  • 在 Kotlin 中设置匿名接口[重复]

    这个问题在这里已经有答案了 我的界面中有一个界面Adapter class interface OnItemClickListener fun onItemClick view View 请注意我的interface是在科特林 我想通过这个
  • 如何使带有转换构造函数的wrapper类在重载解析中胜过wrapper

    我正在尝试设计一个包装器来使用一些特殊逻辑来处理算术参数 https godbolt org z zG959e5Pz https godbolt org z zG959e5Pz include