テンプレート メソッドの設計パターンを使用した次のコードを検討してください。
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 つの異なるバイナリ コードを作成する場合に可能です: A::doSomething() または B::doSomething() のいずれかをインライン化 (ケース 3、1、および 2 でそれぞれ呼び出す必要があります)
この最適化が標準で必要かどうか、またはコンパイラがそれを実装しているかどうかを知っていますか? CRT パターンを使用し、仮想パターンを使用せずに同じ種類の効果を達成できることはわかっていますが、意図はあまり明確ではありません。