Я просто понимаю, насколько сложно задавать вопросы ... Надеюсь, я могу привести примеры, которые являются одновременно достаточно точными, чтобы продемонстрировать мою проблему, и достаточно короткими, чтобы не все испортить ... По крайней мере, есть возможность редактировать.
Так что это моя ситуация на данный момент. Конечно, я немного изменил это с точки зрения логики / структуры (и с точки зрения именования в любом случае), пытаясь сосредоточиться на сути моего вопроса:
// 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);
}
}
В данный момент я предпочел бы возможность1, потому что мне не нужно связываться с наследованием в Extractor для всех вариантов MyType и связанных с ним Extractor, которые я хочу опробовать в будущем.
С другой стороны, для извлечения может потребоваться сложный код и несколько членов (что-то вроде огромных карт, которые отображают определенные входные данные для определенных значений). Таким образом, не будет никакого увеличения производительности при использовании шаблонов. В частности, использование только заголовочных файлов Extractor и, возможно, даже функторов, которые должны быть встроены, являются чем-то вроде вопроса. В прошлом это было сильным указателем на то, что шаблоны будут только увеличивать сложность кода (необходимость иметь дело с созданием экземпляров, усложнять жизнь клиентскому коду и т. Д.) И что я должен попытаться вообще избежать этого.
Или есть третья возможность, о которой я вообще не думал?