2

我想将我的程序的目录结构存储为常量字符串的结构,但 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")?

4

3 回答 3

3

想到了三种方法。前两个类似于你的方法,后者是我可能使用的更典型的方法

#1 - 匿名命名空间 + 内联constexpr函数

出于我的目的,这解决了除 1 个问题之外的所有问题:

#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");
}
于 2013-03-03T12:41:23.187 回答
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");
于 2013-03-03T12:39:43.520 回答
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";

作品。但我也更喜欢命名空间之一。

于 2013-03-03T12:39:58.060 回答