簡體   English   中英

將字符串文字常量定義為 char const* 和 wchar const*

[英]Defining string literal constants once both as char const* and wchar const*

由於我正在使用的域的限制,我需要將字符串文字定義為 char const* 和 wchar const*,例如:

constexpr auto C_VAR_NAME_1 = "MY_VAR_NAME_1";
constexpr auto C_VAR_NAME_2 = "MY_VAR_NAME_2";
...

constexpr auto W_VAR_NAME_1 = L"MY_VAR_NAME_1";
constexpr auto W_VAR_NAME_2 = L"MY_VAR_NAME_2";
...

我有很多常量,我想避免定義兩次相同的變量實際名稱(這可能導致一些拼寫錯誤,因此名稱不匹配),所以我使用了一些這樣的宏:

#define WTEXT_IMPL(name) L##name
#define WTEXT(name)      WTEXT_IMPL(name)

#define MACRO_VAR_NAME_1 "MY_VAR_NAME_1"
#define MACRO_VAR_NAME_2 "MY_VAR_NAME_2"
...

constexpr auto C_VAR_NAME_1 = MACRO_VAR_NAME_1;
constexpr auto C_VAR_NAME_2 = MACRO_VAR_NAME_2;
...
constexpr auto W_VAR_NAME_1 = WTEXT(MACRO_VAR_NAME_1)
constexpr auto W_VAR_NAME_2 = WTEXT(MACRO_VAR_NAME_2)
...

這可行,但如果可能的話,我想擺脫宏的東西; 所以我的問題是:是否可以在編譯時使用沒有宏的普通 C++ 標准來獲得相同的結果? 預先感謝您的幫助。

如果您只能將字符串文字限制為 ASCII 字符,則有一個不使用宏的簡單解決方案(在 C++17 版本中):

template<std::size_t N>
struct DoubleStringLiteral {
    constexpr DoubleStringLiteral(const char(&s)[N])
    {
        for (size_t i=0; i<N; ++i) {
            if (s[i] < 0) throw std::invalid_argument("None ASCII character are not supported!");
            str[i] = s[i];
            wstr[i] = static_cast<wchar_t>(s[i]);
        }
    }

    constexpr std::string_view view() const
    {
        return { str };
    }

    constexpr std::string_view wview() const
    {
        return { wstr };
    }

    char str[N];
    wchar_t wstr[N];
};

constexpr DoubleStringLiteral a{ "Demo!" };
constexpr DoubleStringLiteral b{ R"(Raw!
str
sample)" };

演示

C++11 應該是可行的,但是需要大量的樣板代碼。

這是C++14 版本

我會這樣做:

#include <string_view>

struct DoubleStringLiteral {
    std::string_view str;
    std::wstring_view wstr;
};

#define DOUBLE_LITERAL(name, value) \
    constexpr DoubleStringLiteral name { \
        value, \
        L ## value \
    }

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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