在 C++ 中,如何在运行时获取给定元素的模板类型?

2023-11-24

我正在设计一个简单的Array类能够保存任何类型的对象,就像一个向量可以在一个对象中保存多种类型的数据。 (这是为了学习目的。)

我有一个名为的空基类Container:

class Container {};

还有一个名为的模板化子类Object:

template <class T>
class Object : public Container {
    T& object;
public:
    Object(T& obj = nullptr) : object(obj) {}
};

我有一个Array持有一个类vector的指针Container我用来握住的东西Objects:

class Array {
    std::vector<Container *> vec;
public:
    template <class T>
    void add_element(const T&);
    auto get_element(int);
};

add_element将元素存储到Objects 并将它们放入vec:

template <class T>
void Array::add_element(const T& element)
{
    vec.push_back(new Object<T>(element));
}

get_element从它的中删除元素Object并将其传递回调用者。这就是我的问题所在。为了从Object,我需要知道什么类型Object it is:

auto Array::get_element(int i)
{
    return (Object</* ??? */> *)vec[i])->object;
}

有什么方法可以让我知道我正在存储什么类型的对象吗?

Edit:既然人们声称这是不可能的,那怎么样呢?有没有某种方法可以在类中实际存储类型信息? (我知道你可以在红宝石中做到这一点)。如果我能做到这一点,我可以存储返回类型get_element每一个Object.


我正在为您考虑与此模板类似的内容get_element.

template <class T>
T& Array::get_element(int i, T &t)
{
    Object<T> *o = dynamic_cast<Object<T> *>(vec[i]);
    if (o == 0) throw std::invalid_argument;
    return t = o->object;
}

Array arr;
double f;
int c;

arr.get_element(0, f);
arr.get_element(1, c);

但或者,你可以使用这个:

template <class T>
T& Array::get_element(int i)
{
    Object<T> *o = dynamic_cast<Object<T> *>(vec[i]);
    if (o == 0) throw std::invalid_argument;
    return o->object;
}

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

在 C++ 中,如何在运行时获取给定元素的模板类型? 的相关文章

  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • documentdb 模拟器 gatewayservice 在启动时崩溃

    我想了解 documentdb 并安装模拟器 看起来没有错误 但是 启动后我的服务崩溃了 网关服务启动 从标题来看 我猜测这是模拟器的一项重要服务 有趣的是 模拟器似乎继 续加载并尝试打开 https localhost 8081 expl
  • 如何将答案转换为小数点后两位

    这是我的代码 我想要的输出是txtA Text and txtB Text保留两位小数 Public Class Form1 Private Sub btncalc Click ByVal sender As System Object B
  • 为什么 EF 5.x 对表使用复数名称?

    我对 ORM 框架 例如 Hibernate 甚至 Entity Framework 3 0 有一些经验 默认情况下 这些框架使用表的单数名称 例如 类 User 将映射到表 User 但是 当我使用 Visual Studio 2012
  • 使具有不可选取字段的对象可选取的正确方法是什么?

    对我来说 我所做的就是检测不可选取的内容并将其放入字符串中 我想我也可以将其删除 但随后它会错误地告诉我该字段不存在 但我宁愿让它存在但成为字符串 但我想知道是否有一种不那么老套 更正式的方式来做到这一点 我当前使用的代码 def make
  • Windows 上的 /usr/lib/ 相当于什么?

    我正在创建一个依赖于 libxml2 的跨平台程序 我不想在应用程序的 Windows 端口上使用 POSIX 环境 例如 Cygwin 或 MSYS 我计划使用 Javascript Host for Windows 和 nmake 创建
  • Java 中的函数式数据结构

    Java标准库是否有功能更新的功能数据结构 例如不可变集 列表等 函数式java has 集合 列表以及更多有趣的抽象
  • 如何使用 Java 中的 ResultSet 获取行数?

    我正在尝试创建一个简单的方法 该方法接收 ResultSet 作为参数并返回一个包含 ResultSet 行数的 int 这是一种有效的方法吗 int size 0 try while rs next size catch Exceptio
  • 在 matplotlib 中向辅助 y 轴添加 y 轴标签

    我可以使用以下命令向左侧 y 轴添加标签plt ylabel 但如何将其添加到辅助 y 轴 table sql read frame query connection table 0 plot color colors 0 ylim 0 1
  • Android Studio 错误:无法翻译 setText 中的字符串文字

    这是我的第一个应用程序 我遇到了一些麻烦 当我运行该应用程序时 它崩溃了 我不知道如何修复此错误 public class MainActivity extends AppCompatActivity TextView outputBott
  • 创建“灵活”的 XML 模式

    我需要为 XML 文件创建一个非常灵活的架构 它必须满足以下要求 验证我们需要存在的一些元素 并了解其确切结构 验证一些可选元素 我们知道其确切结构 允许任何其他元素 以任意顺序允许它们 快速示例 XML
  • 蒙戈服务崩溃了。需要查找崩溃原因

    今天早上我在我的服务器上发现 mongo 出现以下错误 System restart required You have mail ubuntu ip xxx xx xx xx mongo MongoDB shell version 2 4
  • Manifest.json 意外令牌

    你好 我将一个反应 表达项目推到了heroku https polar oasis 57801 herokuapp com 并在控制台中收到以下错误 Chrome 控制台错误消息 我尝试查找此错误 似乎我需要更改 manifest json
  • 将数组或列表传递给 @Pathvariable - Spring/Java

    我正在 JBoss Spring 中做一个简单的 获取 我希望客户端在 url 中向我传递一个整数数组 我如何在服务器上进行设置 并显示客户端应该发送消息吗 这就是我现在所拥有的 RequestMapping value test firs
  • multiprocessing.Manager 嵌套共享对象不适用于队列[重复]

    这个问题在这里已经有答案了 Python 文档multiprocessing模块状态 3 6版本更改 共享对象可以嵌套 例如 共享容器对象 例如共享列表 可以包含其他共享对象 这些对象都将由共享容器对象管理和同步 SyncManager 这
  • 在 JavaScript 中定义“嵌套”对象构造函数?

    是否可以在另一个对象中定义一个对象 我在想这样的事情 function MyObj name this name name function EmbeddedObj id this id id 然后我可以创建一个 EmbeddedObj 如
  • Rails 4 中的 form_for 参数数量错误

    我正在使用 form for 标签 它在 Rails 3 0 4 环境中工作 但是当我尝试将项目更新到 Rails 4 时 出现以下错误 参数数量错误 3 对 2 这是我的代码 尝试删除可能试图改变视图中的内容的内容 就我而言 问题在于cl
  • 如何将计算列添加到我的 EF4 模型?

    给定 MS SQL 2008 中的 用户 表和 登录 表 CREATE TABLE dbo User User UserID int IDENTITY 1000 1 NOT NULL UserName varchar 63 NOT NULL
  • 如何解决读取问候语数据包时出现错误?

    我正在尝试连接到 NetBeans 中的服务器 我写的代码如下 运行此代码会返回此错误 wlecome Warning mysqli connect MySQL server has gone away in C xampp htdocs
  • C 和 C++ 中的 static 和 extern 全局变量

    我制作了 2 个项目 第一个项目使用 C 语言 第二个项目使用 C 语言 两者都具有相同的行为 C项目 header h int varGlobal 7 main c include
  • 在 C++ 中,如何在运行时获取给定元素的模板类型?

    我正在设计一个简单的Array类能够保存任何类型的对象 就像一个向量可以在一个对象中保存多种类型的数据 这是为了学习目的 我有一个名为的空基类Container class Container 还有一个名为的模板化子类Object temp