仮想クラスCalculator
とそのクラスの実装例MyCalculator
があります。
template <class T>
class Calculator{
virtual void op1() = 0;
};
template <class T>
class MyCalculator : public Calculator{
void op1(){ do_something(); }
};
次の関数で示されているように使用すると、コンパイラは仮想であるためop1()
、もちろんインライン化できません。op1()
void calculate(Calculator* calc){
calc->op1();
}
ただし、場合によっては、calc
AND の実際の型を知っていて、パフォーマンス上の理由からインライン化したいことがあります。そこで、次の案を考えます。
template <class C>
void calculate(C* calc){
calc->op1();
}
この関数を次のように呼び出します。
Calculator c1 = new Calculator();
calculate(c1); // no inling possible in calculate(...)
MyCalculator c2 = new MyCalculator();
calculate(c2); // inlining possible in calculate(...) ?
最初の例では、インライン化はできませんが、2 番目の例では、 op1()
ofMyCalculator
は 内にインライン化する必要があると思いますcalculate()
。
私の仮定は本当ですか?