在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")?

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

#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";

。但是我更喜欢名称空间的

相关内容

  • 没有找到相关文章

最新更新