Скопируйте конструктор для шаблона, полученного из абстрактного базового класса - PullRequest
0 голосов
/ 22 марта 2020

Не уверен, является ли ответ простым или сложным, но этот случай необычен (отличается от двух похожих сообщений, которые я прочитал):

У меня есть массив указателей (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 на самом деле является большим, сложным шаблоном и производными данными виды довольно многочисленны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...