我有一些代码可以读取文件并查明它是否为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;
};
}
答案 0 :(得分:1)
我建议以不同的形式进行:
enum class Encoding{
UTF8,
UTF16
};
Encoding readFile(const char* path, std::string& utf8Result,std::wstring& utf16result);
现在将文件读取到正确的对象并返回正确的编码作为结果。
使用此函数可以围绕此函数编写通用代码,并使用std::basic_string
附近的模板基因:
template <class T>
void doNext(const std::basic_string<T>& result){/*...*/}
std::string possibleUTF8Result;
std::wstring possibleUTF16Result;
auto res = readFile("text.txt",possibleUTF8Result,possibleUTF16Result);
if (res == Encoding::UTF8){
doNext(possibleUTF8Result);
} else { doNext(possibleUTF16Result); }
*注意:wstring在Windows上为utf16,在linux上为utf32。