私は、あなたが実行時の多型を避けるつもりはないとm-sharpに同意します。
あなたは優雅上での最適化を重視した場合、
void invoke_trivial_on_all(const std::vector<Base*>& v)
{
for (int i=0;i<v.size();i++)
{
if (v[i]->tag==FooTag)
static_cast<Foo*>(v[i])->Foo::trivial_virtual_method();
else if (v[i]->tag==BarTag)
static_cast<Bar*>(v[i])->Bar::trivial_virtual_method();
else...
}
}
のようなものを持って言う
void invoke_trivial_on_all(const std::vector<Base*>& v)
{
for (int i=0;i<v.size();i++)
v[i]->trivial_virtual_method();
}
を交換してみてくださいそれは確かにないOOP(より多くのあなたが古き良きでやるかもしれないものへの復帰、きれいではありません'C')でも、仮想メソッドが十分であれば、呼び出しのない関数を得るべきです(十分なコンパイラ&最適化オプションの対象)。dynamic_castまたはtypeidを使用するバリアントは、ややエレガントで安全かもしれませんが、これらの機能にはオーバーヘッドがあり、これはおそらく仮想呼び出しに匹敵します。
いくつかのクラスメソッドがno-opsであり、呼び出しからあなたを救った場合、または関数に共通のループ不変コードが含まれていて、オプティマイザがホイストを管理している場合それはループの外に出ます。
私はテンプレートのif文がこの混乱を少しきれいにするかもしれないと信じています。とにかく有望に見えます。 – casualcoder
reinterpret_cast <>の代わりにstatic_cast <>を使用してください。後者は特定のケースで誤った結果を表示します(典型的な実装では、FooやBarに複数の基本クラスがあり、 –
良い点ありがとうございます。回答が更新されました。 – timday