Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通用动态_cast<;无效*>;多态类型和非多态类型的等效项_C++_Templates_Dynamic Cast - Fatal编程技术网

C++ 通用动态_cast<;无效*>;多态类型和非多态类型的等效项

C++ 通用动态_cast<;无效*>;多态类型和非多态类型的等效项,c++,templates,dynamic-cast,C++,Templates,Dynamic Cast,我在内存管理器模板中使用dynamic\u cast来获取对象的实际地址。 但是,对于非多态的类型,不允许使用dynamic_cast。 是否有更通用的方法,或者我需要两个版本的模板?您可以使用这两种方法在编译时切换。任何指向对象类型的指针都可以隐式转换为指向cv的指针;但是,它不能保证生成“真实地址”(不管是什么)。[conv.ptr]/2保证生成的空指针“表示内存中与原始指针值相同字节的地址”@DyP:这一点也没有帮助。@DyP:Adynamic\u cast生成指针指向的最派生对象的地址。

我在内存管理器模板中使用
dynamic\u cast
来获取对象的实际地址。 但是,对于非多态的类型,不允许使用
dynamic_cast

是否有更通用的方法,或者我需要两个版本的模板?

您可以使用这两种方法在编译时切换。

任何指向对象类型的指针都可以隐式转换为指向cv的指针;但是,它不能保证生成“真实地址”(不管是什么)。[conv.ptr]/2保证生成的空指针“表示内存中与原始指针值相同字节的地址”@DyP:这一点也没有帮助。@DyP:A
dynamic\u cast
生成指针指向的最派生对象的地址。您可以使用基于标记分派的方法来处理
std::is\u polymorphic
,它可以对非多态类型使用
dynamic\u cast
或仅使用
static\u cast
。当然,只有当您对非多态类型的当前指向对象的地址满意时,这才有效。问题是您无法获得非多态对象的真实地址。如果你希望内存管理器能够处理块中间的自由请求(为什么?C++有这样一个原因,那就是为什么不允许为标准的新/Delphi)定义它,那么你就必须赋予它在自己的数据结构中查找内部指针的能力。它不是C11或Boost项目。你可以自己重新实现它。它不需要编译器魔法,只需要一些奇怪的代码。@SebastianRedl:你是怎么做到的?从具有空类的类型派生并检查派生类的大小是否大于基类的大小(意味着额外的vtable指针)?@SebastianRedl看起来boost实现依赖于vtable的额外大小(使用从要测试的类型派生的类型的
sizeof
)@Xeo Boost版本首先执行is_类检查以过滤出原语。is_类可以通过在一个模板函数上执行SFINAE来实现,该模板函数接受一个指向T成员的指针。然后它从T派生两个类,一个带虚函数,另一个不带虚函数,并检查它们是否大小相同。