考虑以下带有模板方法设计模式的代码:
class A {
public:
void templateMethod() {
doSomething();
}
private:
virtual void doSomething() {
std::cout << “42\n”;
}
};
class B : public A {
private:
void doSomething() override {
std::cout << “43\n”;
}
};
int main() {
// case 1
A a; // value semantics
a.templateMethod(); // knows at compile time that A::doSomething() must be called
// case 2
B b; // value semantics
b.templateMethod(); // knows at compile time that B::doSomething() must be called
// case 3
A& a_or_b_ref = runtime_condition() ? a : b; // ref semantics
a_or_b_ref.templateMethod(); // does not know which doSomething() at compile time, a virtual call is needed
return 0;
}
我想知道编译器是否能够在案例 1 和 2 中内联/取消虚拟化“doSomething()”成员函数。如果它为 templateMethod() 创建 3 段不同的二进制代码,这是可能的:一个没有内联,2内联 A::doSomething() 或 B::doSomething() (在情况 3、1 和 2 中必须分别调用)
您知道标准是否需要这种优化,或者是否有任何编译器实现它?我知道我可以用 CRT 模式而不是虚拟来实现相同的效果,但意图会不太清楚。