使用 decltype 的函数参数类型

2023-12-29

注意:这个问题中提供的示例不是生产代码,没有任何意义。它只是为了说明我的问题。

我正在测试以下的可能性decltype,特别是如果用它来推导函数参数类型,就会遇到问题:

假设有两个类结构如下:

struct ClassInt
{
    // Note: no default ctor
    ClassInt(int value)
        :   m_Value(value)
    {}

    int  m_Value;
};

struct ClassDouble
{
    // Note: no default ctor
    ClassDouble(double value)
        :   m_Value(value)
    {}

    double  m_Value;
};

现在,我编写了一个函数,它(以某种方式)通过字符串检索类型参数(应该是上面之一)的实例,并将给定值分配给它m_Value member:

template< typename Ty >
Ty* get_fake_ptr() { return nullptr; }


// Retrieve pointer to Ty object by name and assign its value member.
// The problem is that we don't actually have an instance of Ty at the point
// where we want to define the type of the parameter "value".
template< typename Ty >
void assign(std::string name, decltype(get_fake_ptr<Ty>()->m_Value) value)
{
    // Somehow get pointer to a Ty object by name
    Ty* obj = ????;

    // Assign
    obj->m_Value = value;
}

现在,参数的类型value取决于类型参数,因为所使用的类的成员类型不同m_Value。正如你所看到的,我通过使用解决了这个问题decltype。现在,通常情况下,您会使用decltype在参数上,如下所示:

template<typename Ty>
void assign(Ty& obj, decltype(obj.m_Value) value);

但这显然在这里是不可能的,因为实际实例是在函数体中检索的,因此在声明函数参数时不可用。

我使用模板函数将其组合在一起get_fake_ptr它只返回一个nullptr匹配类型,因此我有一个“伪实例”,编译器可以使用它来确定成员类型。它有效:

现在,正如我所说,这对我来说似乎真的很棘手。所以:

有没有更好的方法来解决这个问题?

谢谢你!


您可以使用decltype(std::declval<T>().m_Value)推断出类型T's m_Value会员而不是使用您的get_fake_ptr()功能。他们最终实现了相似的目标。

顺便说一下,你的get_fake_ptr()函数不需要定义。你可以简单地将其保留为template <typename T> T* get_fake_ptr();你仍然可以在里面使用它decltype.

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

使用 decltype 的函数参数类型 的相关文章

  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include

随机推荐

  • 在谷歌玩游戏中默默解锁成就,不显示通知

    我正在使用谷歌播放服务 在我的android游戏中取得成就 它实际上是统一的 但并不重要 To unlock achievement I use plugin which calls unlock GoogleApiClient apiCl
  • 如何验证货币字段?

    我有一个带有此货币字段的 ASP NET MVC 4 应用程序 DisplayFormat ApplyFormatInEditMode true DataFormatString 0 c ConvertEmptyStringToNull t
  • 获取通用字典的指定值的多个键?

    从 NET 通用字典中获取键的值很容易 Dictionary
  • 在不使用 WPF 的扩展玻璃框架中绘制文本框

    我正在尝试在表单的扩展玻璃框架上绘制一个文本框 我不会描述这个技术 它是众所周知的 对于那些还没有听说过的人来说 这是一个例子 http www danielmoth com Blog Vista Glass In C aspx http
  • MVC 3 / Razor 中的通用操作链接

    刚刚开始一个新的 MVC 3 项目 我无法获得我在 MVC 2 future 中习惯的强类型通用操作链接和 url 帮助器 我需要推迟哪些 nuget 包和命名空间 Example Html ActionLink
  • 如何安装react(v16.x)和react-scripts(3.x)

    正如标题所示 我不想使用 npx create react app app name 因为该命令安装了react 17x 和react scripts 4 x I tried npm init react app app name scri
  • XML 架构 minOccurs / maxOccurs 默认值

    我想知道 XML 模式规范如何处理这些情况
  • C# 中派生类的可视化

    我有一个基类 代表一个充满小球体的现实世界容器 和一些派生类 这很好用 我的问题是如何进行可视化 我有一个可视化基类的用户控件 为每个派生类都有一个派生的 UserControl 是最佳解决方案吗 还是让一个人为所有人工作更好 Edit 显
  • 如何在 API 级别 < 28 上获取主线程的 Executor

    在 API 级别 28 Pie 上 引入了一种新方法Context获取主线程执行器的类getMainExecutor https developer android com reference android content Context
  • 带颜色条的圆形图

    我正在尝试用颜色条绘制圆形图 几乎像这样 然而 颜色条的最小值当前为1 我希望能够将其设置为 0 import pandas as pd import matplotlib pyplot as plt import matplotlib c
  • 如何使用 MATLAB 的 num2str 格式化输出

    我正在尝试在 MATLAB 中将数字数组作为字符串输出 我知道这很容易使用num2str http www mathworks com access helpdesk help techdoc ref num2str html 但我想要逗号
  • 在 Angular dart 中 type() 的另一种方式

    我完成了 Angular dart 教程 但我有一个问题 要声明可用于依赖注入的类型 我必须这样做 class MyAppModule extends Module MyAppModule type RecipeBookController
  • C 中的静态结构初始化

    我有一个struct输入如下图所示 typedef struct position float X float Y float Z float A position typedef struct move position initial
  • Udev 规则不适用于 Ubuntu 12.04 上的 libusb

    我使用的是 Ubuntu 12 04 5 LTS x86 64 我有一个 USB 设备 它使用 libusb 与计算机进行通信 将其插入计算机并运行通信程序后 出现以下错误 libusb couldn t open USB device d
  • 为什么临时对象必须有不同的地址?

    我感兴趣的情况是 const int n1 123 const int n2 123 我知道这就像字面意思一样123是初始化临时的参数int and const只是一个无聊的编译时检查 但我想知道为什么在这种情况下需要不同的临时变量 而不是
  • has_and_belongs_to_many 连接表的 Rails 迁移

    我该如何做script generate migration为 a 创建一个连接表has and belongs to many关系 该应用程序在 Rails 2 3 2 上运行 但我还安装了 Rails 3 0 3 Where class
  • TypeScript + OpenLayers 7:设置和获取功能 ID 失败

    我有一张带有两个自定义按钮的地图 绘制多边形 and 删除功能 它允许我绘制和删除绘制的多边形 此外 我为多边形创建了一个测量叠加 显示了它们的面积 见图 为了识别多边形和覆盖层之间的连接 我尝试在它们上设置相同的 id 以便在删除多边形时
  • 我怎样才能用javascript制作一个简单的wep密钥生成器?

    我正在尝试制作一个 wep 密钥生成器 并且阅读了 wep 密钥的工作原理 但我真的不知道如何开始制作它 任何人都可以给我一个例子或指导我教程吗 我尝试使用谷歌但没有运气 在 JavaScript 中 function generateHe
  • 在 Velocity 模板中按名称引用地图

    很确定这个问题有一个简单的答案 但就是找不到正确的 VTL 语法 在我的上下文中 我传递了一个包含其他地图的地图 我想按名称引用这些内部映射并在我的模板中分配它们 内部地图由应用程序的不同部分构建 然后添加到上下文中 举例来说 public
  • 使用 decltype 的函数参数类型

    注意 这个问题中提供的示例不是生产代码 没有任何意义 它只是为了说明我的问题 我正在测试以下的可能性decltype 特别是如果用它来推导函数参数类型 就会遇到问题 假设有两个类结构如下 struct ClassInt Note no de