指向对象开头的指针 (C++)

2024-01-10

我需要一种方法来获取指向 C++ 中对象开头的指针。该对象在模板内部使用,因此它可以是任何类型(多态或非多态),并且可能是使用多重继承的对象。

I found 本文 http://accu.org/index.php/journals/450它描述了一种方法(请参阅“动态转换”部分),在 T 是多态类型的情况下使用 typeid 和动态_转换为 void* 。

这在 MSVC 上工作得很好,但是在 GCC (4.x) 上,当它与非多态类型一起使用时,它似乎会失败并抛出编译器错误。

有谁知道一种方法:

  • 使 GCC 表现良好,并正确评估 typeid
  • 或者另一种方法可以在 GCC 上编译

下面是我目前用来尝试实现此目标的代码。

template <typename T>
void* dynamicCastToVoidPtr(T *const ptr)
{
    // This is done using a separate function to avoid a compiler error on some 
    // compilers about non-polymorphic types when calling startOfObject
    return dynamic_cast<void*>(ptr);
}

template <typename T>
void* startOfObject(T *const ptr)
{
    // In cases of multiple inheritance, a pointer may point to an offset within 
    // another object
    // This code uses a dynamic_cast to a void* to ensure that the pointer value 
    // is the start of an object and not some offset within an object
    void *start = static_cast<void*>(ptr);
    if(start)
        typeid(start = dynamicCastToVoidPtr(ptr), *ptr);
    return start;
}

template <typename T>
void doSomethingWithInstance(T *const instance)
{
    // Here is where I need to get a void* to the start of the object
    // You can think of this as the deleteInstance function of my memory pool
    // where the void* passed into freeMemory should point to the
    // start of the memory that the memory pool returned previously
    void *start = startOfObject(instance);
    if(start)
        allocator->freeMemory(start);
}

Thanks.


gcc 的确切错误消息是

error: 不能进行动态转换&n(类型struct N*) 输入void*(源类型不是多态的)

这可以通过使用来处理boost::is_polymorphic结合boost::enable_if and boost::disable_if,不幸的是 gcc 因明显的方法而窒息,所以这里是解决方法:

template <class T>
void* address_of_impl(T* p, boost::enable_if< boost::is_polymorphic<T>, int >)
{
  return dynamic_cast<void*>(p);
}

template <class T>
void* address_of_impl(T* p, ...) { return static_cast<void*>(p); }

template <class T>
void* address_of(T* p) { return address_of_impl(p, 0); }

在我们使用 SFINAE 的地方(省略号始终被认为是重载解析中的最后一个,因此编译器首先尝试使用dynamic_cast由于以下原因,该版本对于非多态类型失败enable_if).

我在 gcc 3.4 上测试过,它通过了。我正在调查另一个问题 https://stackoverflow.com/questions/3491848/enable-if-disable-if-combination-provokes-an-ambiguous-call为什么使用disable_if代替...不起作用。

EDIT:

这是一个简单的错字(忘记了::type bit):

template <class T>
typename boost::enable_if< boost::is_polymorphic<T>, void* >::type
address_of(T* p) { return dynamic_cast<void*>(p); }

template <class T>
typename boost::disable_if< boost::is_polymorphic<T>, void* >::type
address_of(T* p) { return static_cast<void*>(p); }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指向对象开头的指针 (C++) 的相关文章

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 迭代变量并查找特定类型实例的技术

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

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • PHP 允许的 zip mime 类型

    我知道 从这个问题的答案来看 rar zip 文件 MIME 类型 https stackoverflow com questions 6977544 rar zip files mime type 大多数人在 PHP 中检查 zip 文件
  • 在 Bigquery 中 - 如何从 Firebase 事件表查询昨天数据和过去 7 天的数据

    我使用下面的查询来获取指定数据范围的数据 SELECT event date count event name as APP Installs FROM table events WHERE TABLE SUFFIX BETWEEN 201
  • 我应该使用哪种 JDBC 驱动程序类型来访问 Oracle 数据库?

    我们正在 AIX 上的 Tomcat Web 服务器内运行 J2EE 应用程序 我们需要访问 Oracle 数据库的一些视图和存储过程 这个oracle数据库不是我们的应用程序所基于的数据库 而是我们必须与之通信的外部系统 据我现在所知 在
  • 如何将 React 组件渲染为函数返回

    我试图将 React Native 组件渲染为函数返回 但没有成功 代码如下 In App js in a new project import as React from react import View Text TouchableO
  • php命令行选项解析,如何

    我在 PHP 5 2 中使用 Console Getopt 并惊讶地发现它与其他语言 perl bash java 中的 getopt 有何不同 谁能建议如何解析返回的数组 opts 中的参数 php myprog php a varA c
  • opencv如何填充空心线

    I have an image like this after I applied some processings e g cv2 Canny it looks like this now 正如您所看到的 黑线变得空心 我尝试过腐蚀和膨胀
  • python模拟函数未调用

    我正在测试 python 代码 一个 django 3 0 5 项目 尽管我认为它不相关 但我无法调用我的模拟对象的函数 这是我的代码 myproject mypackage myhelpers def get dict return di
  • 当变量等于x时触发事件 - python

    我有以下脚本 每次按下按钮时都会增加计数器 当计数器达到某个数字 即 10 时 可以说我想要触发一个事件 from RPi import GPIO from time import sleep clk 25 dt 8 GPIO setmod
  • 无法从 RecyclerView.OnScrollListener 调用 notificationItemInserted()

    最近我升级了我的recyclerview v7 23 to recyclerview v7 24 2 0 我的应用程序有一个无限滚动列表 错误消息指向该行notifyItemInserted当我将加载视图添加到RecyclerView 空对
  • 将数据追加到 localStorage 对象

    我正在尝试将新对象添加到当前的 localStorage 对象 但没有成功 最后 我得到的不是 localStorage 中的两组数据 而是最后一组数据 对我做错了什么有任何见解吗 谢谢 这就是我想做的 add the first stud
  • Electron - node.js - ng :无法加载文件路径\ng.ps1,因为在此系统上禁用了运行脚本

    我正在尝试编译一个项目Windows 10 in Visual Studio Code 我的设置如下 1 npm版本6 12 2 Node js版本12 13 3 Angular CLI 8 3 19 我遇到的问题是当我尝试运行时ng se
  • Spring MVC 覆盖接收到的内容类型

    我正在开发 Spring MVC 应用程序 并且有一个我无法控制的客户端 该客户端正在 POST JSON 数据 但传输application x www form urlencoded标头 Spring 自然信任此标头并尝试接收数据 但由
  • AMD:javascript 上下文的目的是什么?

    关于AMD 异步模块定义 我读到的阶段是这样的 AMD 格式来自于想要一种比 今天的 编写一堆带有隐式依赖关系的脚本标签 你必须手动订购 和一些易于使用的东西 直接在浏览器中 javascript 上下文的目的是什么 你能举个例子吗 使用
  • SQLiteDiskIOException:创建数据库时磁盘 I/O 错误

    我正在使用以下代码在 android 中创建数据库 public class PackageDBHelper extends SQLiteOpenHelper The Android s default system path of you
  • 向 li 元素添加自动增量值

    我是一名 css 设计师 所以请原谅我不了解任何 js 基本上我想知道如何使用 javascript jquery 将自动增量 id 添加到列表项中 以获取我试图添加一些 css 的内容 before li a href Item numb
  • 从 C# 对象动态构建 SQL WHERE 子句 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 HTTP POST 请求在与 asp net Web API 绑定的 HTML 表中创建过
  • 原则 2:错误:类“..\..”没有名为“...”的字段或关联

    在搜索时 我发现了许多有类似问题的人的结果 但它们总是与关联错误有关 我正在尝试将一个简单的文本字段添加到数据库中的表中 但在我的一生中 我无法弄清楚这次有什么不同 当我以前多次这样做时没有出现任何问题 我已将 record checksu
  • 形成相同 AVL 和展开树的序列?

    是否存在这样一个数字序列 1 7 使用所有数字 每个数字仅一次 可以形成相等的 AVL 和展开树 好吧 出于科学的兴趣 我根据各自的维基百科文章在 Python 中实现了 AVL 和展开树 假设我没有在某个地方犯错误 我的发现是不存在产生相
  • 内存使用率高 - 应用程序响应缓慢:已用内存值没有减少 + 可用内存值没有增加

    当应用程序使用几分钟后 它会慢慢增加Used记忆值和减少Free记忆值 几分钟后应用程序变得非常慢 为什么不释放内存 系统配置 CPU Intel R Xeon R Platinum 8175M CPU 2 50GHz 处理器数量 4 CP
  • 指向对象开头的指针 (C++)

    我需要一种方法来获取指向 C 中对象开头的指针 该对象在模板内部使用 因此它可以是任何类型 多态或非多态 并且可能是使用多重继承的对象 I found 本文 http accu org index php journals 450它描述了一