[英]Storing constants in C++
我想將程序的目錄結構存儲為常量字符串的結構,但是C ++不允許我以任何直觀的方式進行操作。
所以這不起作用:
struct DirStructure {
static const std::string entities = "./entities";
static const std::string scripts = "./scripts";
}
這也沒有:
struct DirStructure {
static const std::string entities() const = { return "./entities"; }
static const std::string scripts() const { return "./scripts"; }
}
(實際上它沒有const,但我不太喜歡)。
這有效:
namespace DirStructure {
static const std::string entities = "./entities";
static const std::string scripts = "./scripts";
}
但是還有其他一些問題。
解決此類問題的標准方法是什么(假設我寧願避免#define MY_SCRIPTS_DIR_PATH "./scripts"
)?
我想到了三種方法。 前兩個類似於您的方法,后一個是我可能使用的更典型的方法
constexpr
函數 出於我的目的,這解決了除了1個問題之外的所有問題:
#include <string>
namespace DirStructure {
namespace {
inline constexpr char const* const entities() { return "./entities"; }
}
};
int main()
{
std::string e = DirStructure::entities();
}
剩下的一個問題是字符串文字不能包含嵌入的NUL字符(對於文件路徑來說這不是問題)。
另一種方法可能是
#include <string>
struct DirStructure
{
std::string entities, scripts;
};
inline static const DirStructure& Config()
{
static DirStructure _s = { "./entities", "./scripts" };
return _s;
}
int main()
{
std::string e = Config().entities;
}
通常,我實際使用的自己類似於:
#include <string>
#include <map>
#include <boost/filesystem.hpp>
int main()
{
const std::map<std::string, boost::filesystem::path> DirStructure = {
{ "entities", "./entities" },
{ "scripts", "./scripts" }
};
auto const& e = DirStructure.at("entities");
}
您的第一個版本應該可以正常工作,並且需要稍作調整。 您應該將聲明與定義分開。
# Declaration in dirstructure.h
struct DirStructure {
static const std::string entities;
static const std::string scripts;
}
# Definition in dirstructure.cpp
const std::string DirStructure::entities("./entities");
const std::string DirStructure::scripts("./scripts");
source.cpp:4:54:錯誤:非文字類型的靜態數據成員'const string DirStructure :: entities'的類內初始化
source.cpp:4:54:錯誤:非恆定的類內初始化對於靜態成員'DirStructure :: entities'無效
source.cpp:4:54:錯誤:(需要類外初始化)
g++
告訴您,需要進行類外初始化,因此:
struct DirStructure {
static const std::string entities;
static const std::string scripts;
}
const std::string DirStructure::entities = "blah";
const std::string DirStructure::scripts = "blah2";
作品。 但是我也更喜歡命名空間之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.