如何处理可能是 std::string 或 std::wstring 的值

How to handle a value that may be an std::string or std::wstring

我有一些代码可以读取文件并确定它是否是 Unicode。根据这个,我想要一个自定义对象,它将文件内容保存为 wstringstring 并能够进行字符串操作。

我想我可以有一个基数 class 和两个派生的 class 代表宽字符串和窄字符串,甚至一个基数 class 代表 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);

或者每种类型都有两个方法并在派生的 classes 中覆盖它们?

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;

};

}

我建议以不同的形式进行:

enum class Encoding{
   UTF8,
   UTF16
};

Encoding readFile(const char* path, std::string& utf8Result,std::wstring& utf16result);

现在将文件读入正确的对象,return 得到正确的编码。 使用此函数可以围绕此函数编写通用代码,并围绕 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