簡體   English   中英

在C ++中存儲常量

[英]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" )?

我想到了三種方法。 前兩個類似於您的方法,后一個是我可能使用的更典型的方法

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

您的第一個版本應該可以正常工作,並且需要稍作調整。 您應該將聲明與定義分開。

# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM