可以为 NULL 的 C++ 字符串

标签 c++ string null

我习惯于在我的 C++ 应用程序中像这样传递字符串:

void foo(const std::string& input)
{
  std::cout << input.size() << std::endl;
}

void bar()
{
  foo("stackoverflow");
}

现在我有一种情况,我希望字符串为 NULL:

void baz()
{
  foo("stackoverflow");
  foo(NULL); // very bad with foo implementation above
}

我可以将 foo 更改为:

void foo(const std::string* input)
{
  // TODO: support NULL input
  std::cout << input->size() << std::endl;
}

但是要传递字符串文字或将 char* 复制到 foo 的实现中,我需要这样写:

void bar()
{
  string input("hi"); // annoying temporary
  foo(&input);
  foo(NULL);  // will work as long as foo handles NULL properly
}

我开始考虑从 std::string 继承并添加一个 null 属性,但我不太确定这是个好主意。也许简单地为可以为 NULL 的参数使用 const char* 字符串会更好,但是如果我想保存字符串(或 NULL)的拷贝而不必自己管理其内存怎么办? (参见 What are some of the drawbacks to using C-style strings? 等)

有什么巧妙的解决方案吗?

最佳答案

如果你希望类型为null,那就让它成为一个指针。传递字符串指针而不是引用,因为这正是指针可以做的,而引用不能。引用总是指向相同的有效对象。指针可以设置为空,或重新定位以指向另一个对象。因此,如果您需要指针可以做的事情,请使用指针。

或者,使用 boost::optional,它允许以更类型安全的方式指定“此变量可能包含也可能不包含值”。

或者,当然,更改语义以便您使用空字符串而不是 null,传递一个单独的 bool 参数来指定字符串是否可用,或者重构以便您首先不需要它。

关于可以为 NULL 的 C++ 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/341743/

相关文章:

c++在复制构造函数中调用函数

c++ - '{' 标记错误之前的预期主表达式

c - C 中反转字符串时出现奇怪的字符

带有两个 NULL 字符串的 PostgreSQL COPY CSV

c++ - 通过 UDP 套接字手动发送到 iperf? (C++)

c++ - 在 C/C++ 中用两个线程操作不同的数组索引时,是否需要同步?

string - 从双引号 bash 脚本中包含的字符串中删除空格

c - C 中的递归例程反向打印字符串

swift - 滑动操作单元 Swift 出现错误异常

properties - Spring @Value 属性在自定义 pojo 中为 null