時にIDを持つオブジェクトを取得するのは、我々は次のオブジェクトを持っているとしましょう:C++ランタイム
struct A{
static const int ID = 1;
};
struct B{
static const int ID = 2;
};
struct C{
static const int ID = 3;
};
struct D{
static const int ID = 4;
};
struct Collection{
std::vector<A> o1;
std::vector<B> o2;
std::vector<C> o3;
std::vector<D> o4;
};
Collection collection;
私は何をしたいことはCollection
のvector
Sの一部への参照を取得しています。これらを取得するには、次の3つの方法があります。
タイプ別には、
vector
です。collection.get<A>();
コンパイル時のIDは、
vector
によって保持されているすべてのオブジェクトによって定義されます。collection.get<4>();
- IDは実行時にIDで指定します。
collection.get(id);
ケース1は、ケース2に変換できるので、T::ID
で簡単です。ケース2は、テンプレートの特殊化で実装できます(ただし、オブジェクトがたくさんある場合は醜いです)。 ケース3が大変困っています。いくつかの巨大なif
またはswitch
のステートメントがなければ、それはほとんど不可能であると肩代わりします。
私の質問は以下のとおりです。
- ケース2は、よりエレガントにする方法はありますか?
- ケース3はどのように実装する必要がありますか?
常に「A、B、C、D」しかありませんか? –
おそらくいいえ、少なくとも30があります。 – Overblade
あなたはランタイム値を持っています。あなたはそれが何であるか分からない。その値に応じて異なるタイプの演算を行う必要があります。つまり、同じ関数テンプレートの異なるインスタンス化であっても、まったく異なるコードパスを意味します。つまり、ランタイムブランチを意味します。だから、あなたは 'switch'や' map 'のいずれかを持っています。 –
Useless