У меня есть код, который читает файл и выясняет, Unicode это или нет. В зависимости от этого я хотел бы иметь пользовательский объект, который будет содержать содержимое файла как wstring
или string
и иметь возможность выполнять манипуляции со строками.
Я подумал, что могу просто иметь базовый класс с двумя производными классами, представляющими широкие и узкие строки, или даже базовый класс для string
и один производный для wstring
. Что-то типа:
class CustomString
{
public:
static CustomString *methodFactory(bool _unicode);
std::string Value;
}
class NarrowString : public CustomString
{
public:
SingleByte(std::string _value);
std::string Value;
}
class WideString : public CustomString
{
public:
WideString (std::wstring _value);
std::wstring Value
}
С чем у меня больше проблем, так это с методами манипулирования строками, скажем, мне нужны .replace
, .length
и .substr
, как я могу их реализовать? Нужно ли мне использовать шаблоны?
virtual T replace(size_t _pos, size_t _len, const T& _str);
Или иметь два метода для каждого типа и переопределять их в производных классах?
virtual std::string replace(size_t _pos, size_t _len, const std::string& _str)
virtual std::wstring replace(size_t _pos, size_t _len, const std::wstring& _str)
Пример того, как будет выглядеть интерфейс с использованием шаблонов и без наследования:
class CustomString
{
public:
CustomString();
CustomString(bool _unicode);
template <typename T>
T get();
template <typename T>
T replace(size_t _pos, size_t _len, const T& _str);
long length();
template <typename T>
T substr(size_t _off);
template <typename T>
T append(const T& _str);
template <typename T>
T c_str();
private:
std::wstring wValue;
std::string nValue;
bool unicode;
};
}