Я работаю с конкретной библиотекой классов. Все доступные классы значений являются производными от базового класса. Есть скалярные типы
oaBooleanValue : public oaValue
oaIntValue : public oaValue
oaFltValue : public oaValue
oaStringValue : public oaValue
Первые 3 класса определяют метод get () как возвращаемое значение. И 4-й класс определяет get как ссылку.
oaBoolean get() const;
oaInt get() const;
oaFloat get() const;
void get(oaString& value) const;
Мне нужно использовать все 4 класса в моем классе-шаблоне.
Я написал вспомогательный класс oaStringValueGetter, как показано ниже. Но есть проблема. Базовый класс oaValue ограничивает конструктор по умолчанию и конструктор копирования. Существует только один способ создания экземпляров с помощью статического метода create ().
Есть ли способ добавить некоторые методы приведения типов в мой класс, чтобы он автоматически конвертировал из oaStringValue?
class oaStringValueGetter : public oaStringValue
{
public:
oaString get() const
{
oaString str;
oaStringValue::get(str);
return str;
}
};
А вот частичное определение класса, взятое из библиотеки, для справки
class oaObject {
public:
// public methods are here
protected:
~oaObject();
private:
oaObject();
oaObject(const oaObject& obj);
oaObject& operator=(const oaObject& obj);
};
class oaValue : public oaObject {
public:
void destroy();
oaBoolean isEqual(oaValue *value) const;
oaValue *copy() const;
};
class oaString; // library-defined custom string class
class oaStringValue : public oaValue {
public:
static oaStringValue* create(oaObject* database, const oaString &value);
void get(oaString& value) const;
void set(const oaString& value);
};
typedef int oaInt4;
class oaIntValue : public oaValue {
public:
static oaIntValue* create(oaObject* database, oaInt4 value);
oaInt4 get() const;
void set(oaInt4 value);
};
Я думаю, что вы путаете концепцию оболочки против подкласса.
Оболочка не обязательно подклассирует содержащийся класс, она может состоять из пример содержащегося класса, в котором вызовы в составляющий класс делегируются составленному классу вместо прямого наследования.
В вашем случае наличие оболочек содержит экземпляры упакованных классов, а затем делегирование вызовов может быть проще.
Попробуйте создать шаблонную функцию для получения значения из объекта типа T, возвращая результат метода get () объекта. Это будет реализация по умолчанию для скаляров. Затем сделайте специализацию этого шаблона, где T = oaString и временная переменная oaString используются для получения строкового значения, как того требует ваш интерфейс. Вернуть эту переменную в результате. Надеюсь, это поможет вам