jle*_*ahy 8 c++ memory-layout type-traits vptr itanium-abi
如果我有一个类Base,至少有一个虚函数,并且一个Derived类从中单独继承,(uintptr_t)derived - (uintptr_t)static_cast<Base*>(derived)则保证(由Itanium ABI)为零,即使Derived不是标准布局.然而,在一般情况下,这不一定是真的(例如,多重继承).
是否有可能编写一个特征,可用于检测一个类是否是另一个类的主要基类?
来自Itanium ABI的有用部分:
http://refspecs.linux-foundation.org/cxxabi-1.83.html
主要基类
对于动态类,它与偏移0共享虚拟指针的唯一基类(如果有).它是第一个(以直接基类顺序排列)非虚拟动态基类(如果存在).
动态类
需要虚拟表指针的类(因为它或其基数具有一个或多个虚拟成员函数或虚拟基类).
这将是下一个标准的一部分.这是通过std::bases和std::direct_bases特征中止的TR2的一部分.如果您正在使用包含draft-TR2的编译器,您可能会对此有所支持.例如,在GCC 4.7.2中:
#include <demangle.hpp>
#include <iostream>
#include <tr2/type_traits>
struct T1 { };
struct T2 { };
struct Foo : T1, T2 { };
int main()
{
std::cout << demangle<std::tr2::direct_bases<Foo>::type>() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这打印:
std::tr2::__reflection_typelist<T1, T2>
Run Code Online (Sandbox Code Playgroud)
(demangler是我自己的;你可能已经在别处看过了.)
我相信你可以建立一个合适的"多态性,并且具有正好零或一个碱基"的特性.
| 归档时间: |
|
| 查看次数: |
1837 次 |
| 最近记录: |