質問をするのがいかに難しいかを理解しています...うまくいけば、問題を実証するのに十分正確で、すべてを台無しにしないのに十分短い例を示すことができます...少なくとも編集する可能性があります。
ですから、これは今の私の状況のようなものです。もちろん、私の質問の本質に焦点を当てようとして、論理/構造の観点から(そしてとにかく命名の観点から)それを少し変更しました:
// MyClass deals with lists (actually several data structures) of the
// type MyType which should support different types and has to be
// efficiently dealt with. Templating seems just right here
class MyClass
{
...
void doSomething<class MyType>(vector<MyType> someList);
...
// At some point I have to extract elements of the type MyType.
// The extractor obviously depends on MyType but it is not possible to
// Create a general version that could use templates itself
// (unless I use a specialization for each possible MyType)
// I am stuck between these two alternatives:
// Possibility1:
// Let the client pass the right extractor and template it.
template<class Extractor, class MyType>
void extract(const Extractor& extractor, const string& source,
vector<MyType>* dest)
{
extractor.extract(source, dest);
}
// Possibility2:
// Use a member _extractor of some base type that has to be set
// to a specialization. The ExtractorBase has a virtual method
// template<T> void extract(const string& source, vector<T>* myType) = 0
// with no definition that is only defined in subclasses wrt certain
// postings.
ExtractorBase _extractor;
template<class MyType>
void extract(const string& source, vector<MyType>* dest)
{
_extractor.extract(source, dest);
}
}
現時点では、possible1をお勧めします。これは、将来試してみたいMyTypeのすべてのバリアントと関連するExtractorについて、Extractorの継承をいじる必要がないためです。
一方、エクストラクタには、複雑なコードといくつかのメンバー(特定の入力を特定の値にマップする巨大なマップのようなもの)が必要になる場合があります。したがって、テンプレートを使用してもパフォーマンスは向上しません。特にヘッダーファイルのみを使用する場合、エクストラクターと、おそらくインライン化されるはずのファンクターでさえ、問題外です。これまで、これは、テンプレートを使用するとコードの複雑さが増すだけであり(インスタンス化に対処する必要がある、クライアントコードの処理が困難になるなど)、それを完全に回避する必要があることを強く示しています。
それとも、私がまったく考えていなかった3番目の可能性がありますか?