特定长度的c++字符串

C++ string of a specific length

本文关键字:c++ 字符串      更新时间:2023-10-16

我正试图编写一个具有"序列号"概念的函数。它有一个特定的长度。我希望通过创建一个名为SerialNumber的新类型来简化构造函数,该类型包装了13字节数的概念。例如,我不想要一个Product(const char* m)或Product(const std::string&Str),它将截断值并违反直觉。它更喜欢Product(const SerialNumber&我总能指望它是正确的长度。最好的方法是什么?它应该为char[13]定义一个类型定义,还是有一种方法可以用字符串类做到这一点?

最简单的方法是创建一个接受std::string的构造函数,然后在构造函数中验证长度是否确实为13。如果不是,只需抛出一个异常——这就是它们存在的原因。请记住,char[13]不能保证字符串长度为13个字符,毕竟它可以是"hi",后面跟着11个空终止符。

我不确定您的情况,但一种选择是仍然使用std::string,但例如Product的构造函数会抛出,如果字符串是错误的长度。否则,最简单的方法似乎是std::string(或char[14])的包装SerialNumber类,但我犹豫在c++代码中使用C-string)。

我将使用typedef char[13]或在char[13]周围使用包装类。由于字符表与char*相同,因此如果需要,您可以轻松地将其转换为std::string。

我会做如下操作

struct SerialNumber {
    static bool TryCreate(const std::string& data, std::auto_ptr<SerialNumber>& ptr) {
        if (data.length() != 13) {
            ptr.reset();
            return false;
        } else {
            ptr.reset(new SerialNumber(data.c_str()));
            return true;
        }
    }
private:
    SerialNumber(const char* data) {
        memcpy(m_data, data, sizeof(data));
    }
    char m_data[13];
};