我想将程序的目录结构存储为常量字符串的结构,但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"
)?
答案 0 :(得分:3)
我想到了三种方法。前两个类似于你的方法,后者更像是我可能使用的方法
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");
}
答案 1 :(得分:2)
您的第一个版本应该可以正常工作,只需稍作调整即可。您应该从您的定义中拆分您的声明。
# 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");
答案 2 :(得分:1)
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";
的工作原理。但我也更喜欢命名空间。