【问题标题】:How can I make a type safe string "definition" object in C++? [duplicate]如何在 C++ 中创建类型安全的字符串“定义”对象? [复制]
【发布时间】:2017-06-17 10:48:56
【问题描述】:

我喜欢使用 enum 类来尽可能避免硬编码值,但对于字符串来说它有点复杂。我想分享一个我觉得有点笨重的设计,我希望能有一些关于如何简化它的想法。

class StringDefinition
{
private:
   StringDefinition(const std::string &def);

public:
    bool operator==(const StringDefinition&rhs) const;

public:
   static const StringDefinition StringDefinitionOne;
   static const StringDefinition StringDefinitionTwo;
   static const StringDefinition StringDefinitionThree;

public:
   std::string ToString() const;

private:
   string stringDef;
};

StringDefinition::StringDefinition(const std::string &stringDef)
{
   this->stringDef = stringDef;
}

const StringDefinition StringDefinition::StringDefinitionOne("One");

etc...

欢迎所有想法和cmets。

编辑:我没有使用字符串文字,因为它不会强制开发人员使用定义列表中的值。即使您希望他们使用您的字符串文字,他们仍然可以对字符串进行硬编码。如果我在做一些疯狂的事情,我会喜欢一些建设性的批评,而不是仅仅投反对票。

【问题讨论】:

  • 这带来了什么只是一个命名的全局字符串文字?
  • 我不想只用 const 字符串创建一个对象,因为类型是字符串。任何人仍然可以对字符串进行硬编码。假设我创建了一个方法并且我想要传入一个 StringDefinition,我可以这样做。如果我使用字符串文字,有人可以传递硬编码字符串
  • 一个std::tuple<const std::string, const std::string, ...> 可能吗?
  • @Pitfall 有什么办法可以阻止某人创建自己的 StringDefinition 并将其传入?
  • 使用枚举来强制执行值。来自外部世界(例如文件或数据库)的输入字符串应转换为/从枚举。

标签: c++ string enums


【解决方案1】:

这是个人品味的问题,但如何保持简单一点;类似于:

enum class Foo { Ack, Eek };

explicit operator std::string(Foo foo) {
    static const char* const names[] = { "Ack", "Eek" };
    return names[(int)foo];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2021-06-28
    • 2011-07-11
    • 2011-06-23
    • 2011-06-23
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多