c++ - 有没有一种干净的方法可以从 getenv 调用中实例化一个 const std::string 私有成员
问题描述
我有一个类需要获取环境变量并在各种处理中使用它。它应该是常量。我对 constness 的理解是它必须在初始化时实例化。所以这样的事情会起作用
class C
{
public:
C() : idFromEnv(getenv("ENV")) {}
private:
std::string idFromEnv;
};
但这不是一种安全的方法,因为如果字符串为空,则会引发异常。我认为可能有一种方法可以结合三元运算符来做到这一点。像这样的东西,但这真的很难看:
class C
{
public:
C() : idFromEnv(getenv("ENV") ? getenv("ENV") : "UNKNOWN")
{
std::cout << idFromEnv << "\n";
}
private:
const std::string idFromEnv;
};
我不使用那个。有人有更优雅的建议吗?
根据建议,我尝试了这个。它确实有效。不完全是我的想法。
class C
{
public:
inline const std::string getEnvString(const char *env)
{
char* cStr = getenv(env);
return(std::string(cStr ? cStr : "UNKNOWN"));
}
C() : idFromEnv(getEnvString("ENV"))
{
std::cout << idFromEnv << "\n";
}
private:
const std::string idFromEnv;
};
解决方案
我对 constness 的理解是它必须在初始化时实例化。
您提供的第一个示例中没有问题,因此如果您不想在构造函数的初始化列表中进行初始化,const
则无需进行初始化。idFromEnv
您可以在构造函数的主体中分配它,例如:
class C
{
public:
C()
{
char* cStr = getenv("ENV");
idFromEnv = cStr ? cStr : "UNKNOWN";
}
private:
std::string idFromEnv;
};
但是,如果idFromEnv
需要const
,那么是的,您必须在构造函数的初始化列表中对其进行初始化。因此,使用辅助函数来包装额外的getenv()
处理确实是您最好的选择,例如:
std::string getenvstr(const char *env)
{
char* cStr = getenv(env);
return cStr ? cStr : "UNKNOWN";
}
class C
{
public:
C() : idFromEnv(getenvstr("ENV")) {}
private:
const std::string idFromEnv;
};
推荐阅读
- asp.net-web-api - 枚举未在 .net Core Web API GET 响应中将 expando 对象转换为 XML
- azure - Azure 应用服务托管 asp.NET 核心 MVC 应用
- docker - How to set docker path for Jenkins local? docker: command not found
- node.js - Mongodb query params ( combine $gt with $in )
- go - Decode a debeuzium event schema into a meaningful datastructure in golang
- php - making report in laravel
- pytorch - AzureML SDK not working with PyTorch 1.5?
- java - Java how to remove fields into a String value?
- python - greenlet.error: cannot switch to a different thread
- php - PHP simplexml_load_file and LIBXML_NOENT