Не уверен, является ли ответ простым или сложным, но этот случай необычен (отличается от двух похожих сообщений, которые я прочитал):
У меня есть массив указателей (Base *), которые указывают на фабрику объекты шаблона (TDerived):
Base* sAllTypesOfDataObjects[ kNMOfObjectSlots ];
Мне нужно сделать глубокую копию этого массива, где указатели на объекты являются копиями любых шаблонизированных типов данных, из которых я построил.
Могу ли я поместить обобщенный конструктор копирования в производный шаблон (TDerived) для конкретных типов данных (double, Rect, структуры без указателей) и отдельную реализацию шаблона для объектов, имеющих указатели / std :: string ?
Уменьшенный пример моей реализации:
// Abstract base class (for TDerived template, below)
class Base
{
public:
Base(int someValue) { fValue = someValue; }
virtual ~Base() { }
virtual void WriteData(iostream& outFile) = 0;
protected:
int fValue;
};
// template derived from abstract Base
template<class T>
class TDerived : public Base
{
public:
explicit TDerived(int value) : Base(value) { }
T& GetData(void) { return fData; }
// MUST BE IMPLEMENTED IN DERIVED CLASSES
virtual void WriteData(iostream& outFile) override;
private:
T fData; // will hold the templatized data
};
// templates for various data types (std::string, double, Rect, etc)
// TString
typedef TDerived<std::string> TString;
template<>
void TString::WriteData(iostream& outFile); // defined in .cpp
// TDouble
typedef TDerived<double> TDouble;
template<>
void TDouble::WriteData(iostream& outFile); // defined in .cpp
// TRect
typedef TDerived<Rect> TRect;
template<>
void TRect::WriteData(iostream& outFile); // defined in .cpp
Опять же, приведенный выше пример уменьшен: шаблон TDerived на самом деле является большим, сложным шаблоном и производными данными виды довольно многочисленны.