我想将程序的目录结构存储为常量字符串结构,但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"
)?
我想到了三种方法。前两个类似于您的方法,后一个更典型,我可能会使用
#1 -匿名命名空间+内联constexpr
函数
对于我的目的,这解决了除了一个问题之外的所有问题:
#include <string>
namespace DirStructure {
namespace {
inline constexpr char const* const entities() { return "./entities"; }
}
};
int main()
{
std::string e = DirStructure::entities();
}
剩下的一个问题是字符串字面值不能包含嵌入的NUL字符(这在文件路径的情况下不是问题)。
#2 -聚合初始化
另一种方法可能是
#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;
}
#3 -表达型
通常我自己使用的类似于:
#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: error:类内初始化静态数据成员非文字类型的const string DirStructure::entities
source.cpp:4:54: error:类中的非常量初始化无效for static member 'DirStructure::entities'
source.cpp:4:54: error类外初始化是必需的)
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";
。但是我更喜欢名称空间的