C++ 有条件地设置std::string

C++ 有条件地设置std::string,c++,C++,在这种情况下,我必须将std::string设置为NULL。代码如下所示: 常量std::string变量=“HOME”; const std::string str=getenv(variable.c_str()); 问题是,getenv()如果找不到环境变量,则返回NULL,并且由于无法将std::string设置为NULL值,因此必须为其分配一个空字符串 一种选择是: 常量std::string str=(getenv(variable.c_str())==NULL?“:getenv

在这种情况下,我必须将std::string设置为NULL。代码如下所示:

常量std::string变量=“HOME”;
const std::string str=getenv(variable.c_str());

问题是,
getenv()
如果找不到环境变量,则返回NULL,并且由于无法将std::string设置为
NULL
值,因此必须为其分配一个空字符串

一种选择是:

常量std::string str=(getenv(variable.c_str())==NULL?“:getenv(variable.c_str());
只是它调用了getenv()两次

实现这一结果的最佳实践是什么

std::string string_from_char_array(const char* str)
{
  return str ? str : "";
}
那就这样说吧

const std::string str = string_from_char_array(getenv(variable.c_str()));
实现这一结果的最佳实践是什么

std::string string_from_char_array(const char* str)
{
  return str ? str : "";
}
自己卷(包装):

只是它调用了getenv()两次

实现这一结果的最佳实践是什么

std::string string_from_char_array(const char* str)
{
  return str ? str : "";
}
通过将getenv()的结果赋给如下
auto
变量,可以避免调用它两次

    auto var = getenv(variable.c_str();
    const std::string str = (var == NULL ? "" : var);
 

希望它能帮助您:)

为什么需要第二个
getenv
呼叫?我不太明白。看起来第一行代码本身就达到了前两行代码的效果。@wolfPack88:在三元语句的右边有一些东西。啊。。。把它读成两行,我没注意。顺便说一句,我的坏蛋,@chris我认为这个案例是这样的,为了更清楚地了解发生了什么,是否最好执行
return str!=无效的str:“”?我知道这是一个风格问题。@MattKline,就我个人而言,布尔指针是我认为非常有意义的少数几件事之一。@Matt我想这是一个风格问题,但我站在一边,认为将指针与NULL(或std::nullptr)进行比较是不必要的冗长。;)使用lambdas,您甚至可以在一行中完成:
const std::string s=[](char const*str){return str?str:;}(getenv(v.c_str())
@comicsanss是的,但是每次你都需要写同样的东西(尽管这是一件简单的事情)。我想说,这并不能提高可读性。如果这样做,我可能会使它更通用一些。类似于
T value_或(const T&T,const T&def){return T?T:def;}
,但可能会有一两个性能调整,除非它是内联的。