我试图通过虚拟表和继承来解决一些低级别的问题.
通过继承两个类并添加新的虚函数来创建新类时,vptr将存储在哪里?
在我看来,编译器在这种情况下执行一些'vptr-optimization'.而我正想弄明白.
假设,我们有以下结构:
struct A
{
int a;
virtual void fa();
};
struct B
{
double b;
virtual void fb();
};
struct C : A, B
{
char c;
virtual void fa();
virtual void fb();
virtual void fc();
};
Run Code Online (Sandbox Code Playgroud)
在86的情况下和对齐= 4,A并且B在存储器中看起来像这样:
+------+------+
A: | vptr | a |
+------+------+
sizeof(A) = 4 + 4 = 8
+------+------+------+------+
B: | vptr | b |
+------+------+------+------+
sizeof(B) = 8 + 8 = 16
Run Code Online (Sandbox Code Playgroud)
但是当我尝试重新组装时C,我得到了这个:
+------+------+------+------+------+------+------+ …Run Code Online (Sandbox Code Playgroud) 我想为整数类型、字符串和其他类型定义函数。
我可以写:
template<typename T, typename = std::enable_if<std::is_integral<T>::value>::type>
void foo();
template<typename T, typename = std::enable_if<std::is_same<std::string>::value>::type>
void foo();
Run Code Online (Sandbox Code Playgroud)
但是我如何定义在其他情况下将被调用的函数(如果T不是整数类型而不是std::string)?