我想了解如何选择一些 C++ 方法的实现,例如这种方法:
#include <iostream>
class A {
public:
void foo()
{
std::cout << "foo A" << std::endl;
}
};
class B {
public:
void foo()
{
std::cout << "foo B" << std::endl;
}
};
template <typename T>
class C : public T {
};
int main () {
C<A> ca;
C<B> cb;
// Можно заметить, что вызов функций происходит напямую - без indirection call оверхеда.
// Никаких указателей на функции, значения которых будут разыменовываться в райнтайме
ca.foo(); // call 4011f0 <A::foo()>
cb.foo(); // call 40121c <B::foo()>
return 0;
}
问题是 - 也许有一些方法可以替换特定的函数调用地址,但不使用模板构造和/或继承,同时能够在不同的实现之间轻松切换?
例如,使用类型别名提取我们想要从中提取函数地址的类型,例如:
#include <iostream>
class A {
public:
void foo()
{
std::cout << "foo A" << std::endl;
}
};
class B {
public:
void foo()
{
std::cout << "foo B" << std::endl;
}
};
class C {
public:
using T = B;
/* Тут и происходит магия, которая выполняет подстановку адреса функции */
};
int main () {
C cb;
cb.foo(); // call 40121c <B::foo()>
return 0;
}
谢谢你。