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

时间:2016-01-21 11:52:09

标签: c++ string wstring

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

我以为我可以拥有一个基类,其中有两个派生类,表示宽字符串和窄字符串,甚至是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;

};

}

1 个答案:

答案 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。