久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

在 C++ 中方便地聲明編譯時字符串

Conveniently Declaring Compile-Time Strings in C++(在 C++ 中方便地聲明編譯時字符串)
本文介紹了在 C++ 中方便地聲明編譯時字符串的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

能夠在 C++ 編譯時創建和操作字符串有幾個有用的應用.盡管可以在 C++ 中創建編譯時字符串,但該過程非常繁瑣,因為該字符串需要聲明為可變字符序列,例如

Being able to create and manipulate strings during compile-time in C++ has several useful applications. Although it is possible to create compile-time strings in C++, the process is very cumbersome, as the string needs to be declared as a variadic sequence of characters, e.g.

using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>;

字符串連接、子字符串提取等操作可以輕松實現為對字符序列的操作.是否可以更方便地聲明編譯時字符串?如果沒有,是否有工作中的提案可以方便地聲明編譯時字符串?

Operations such as string concatenation, substring extraction, and many others, can easily be implemented as operations on sequences of characters. Is it possible to declare compile-time strings more conveniently? If not, is there a proposal in the works that would allow for convenient declaration of compile-time strings?

理想情況下,我們希望能夠如下聲明編譯時字符串:

Ideally, we would like to be able to declare compile-time strings as follows:

// Approach 1
using str1 = sequence<"Hello, world!">;

或者,使用用戶定義的文字,

or, using user-defined literals,

// Approach 2
constexpr auto str2 = "Hello, world!"_s;

其中 decltype(str2) 將有一個 constexpr 構造函數.可以實現方法 1 的更混亂版本,利用您可以執行以下操作的事實:

where decltype(str2) would have a constexpr constructor. A messier version of approach 1 is possible to implement, taking advantage of the fact that you can do the following:

template <unsigned Size, const char Array[Size]>
struct foo;

然而,數組需要有外部鏈接,所以要使方法 1 起作用,我們必須這樣寫:

However, the array would need to have external linkage, so to get approach 1 to work, we would have to write something like this:

/* Implementation of array to sequence goes here. */

constexpr const char str[] = "Hello, world!";

int main()
{
    using s = string<13, str>;
    return 0;
}

不用說,這很不方便.方法2實際上是不可能實現的.如果我們要聲明一個 (constexpr) 文字運算符,那么我們將如何指定返回類型?由于我們需要操作符返回一個可變字符序列,所以我們需要使用 const char* 參數來指定返回類型:

Needless to say, this is very inconvenient. Approach 2 is actually not possible to implement. If we were to declare a (constexpr) literal operator, then how would we specify the return type? Since we need the operator to return a variadic sequence of characters, so we would need to use the const char* parameter to specify the return type:

constexpr auto
operator"" _s(const char* s, size_t n) -> /* Some metafunction using `s` */

這會導致編譯錯誤,因為 s 不是 constexpr.嘗試通過執行以下操作來解決此問題并沒有多大幫助.

This results in a compile error, because s is not a constexpr. Trying to work around this by doing the following does not help much.

template <char... Ts>
constexpr sequence<Ts...> operator"" _s() { return {}; }

標準規定這種特定的文字運算符形式保留用于整數和浮點類型.雖然 123_s 會起作用,但 abc_s 不會.如果我們完全放棄用戶定義的文字,而只使用常規的 constexpr 函數會怎樣?

The standard dictates that this specific literal operator form is reserved for integer and floating-point types. While 123_s would work, abc_s would not. What if we ditch user-defined literals altogether, and just use a regular constexpr function?

template <unsigned Size>
constexpr auto
string(const char (&array)[Size]) -> /* Some metafunction using `array` */

和以前一樣,我們遇到的問題是,數組現在是 constexpr 函數的參數,它本身不再是 constexpr 類型.

As before, we run into the problem that the array, now a parameter to the constexpr function, is itself no longer a constexpr type.

我相信應該可以定義一個 C 預處理器宏,它將字符串和字符串的大小作為參數,并返回由字符串中的字符組成的序列(使用 BOOST_PP_FOR,字符串化、數組下標等).但是,我沒有時間(或足夠的興趣)來實現這樣的宏 =)

I believe it should be possible to define a C preprocessor macro that takes a string and the size of the string as arguments, and returns a sequence consisting of the characters in the string (using BOOST_PP_FOR, stringification, array subscripts, and the like). However, I do not have the time (or enough interest) to implement such a macro =)

推薦答案

我沒有看到任何東西可以與 Scott Schurr 的 str_const 在 C++ Now 2012 上發表.不過它確實需要 constexpr.

I haven't seen anything to match the elegance of Scott Schurr's str_const presented at C++ Now 2012. It does require constexpr though.

以下是您如何使用它,以及它可以做什么:

Here's how you can use it, and what it can do:

int
main()
{
    constexpr str_const my_string = "Hello, world!";
    static_assert(my_string.size() == 13, "");
    static_assert(my_string[4] == 'o', "");
    constexpr str_const my_other_string = my_string;
    static_assert(my_string == my_other_string, "");
    constexpr str_const world(my_string, 7, 5);
    static_assert(world == "world", "");
//  constexpr char x = world[5]; // Does not compile because index is out of range!
}

沒有比編譯時范圍檢查更酷的了!

It doesn't get much cooler than compile-time range checking!

無論是使用還是實現,都沒有宏.并且對字符串大小沒有人為限制.我會在這里發布實現,但我尊重 Scott 的隱含版權.實現在他的演示文稿的一張幻燈片上,鏈接到上面.

Both the use, and the implementation, is free of macros. And there is no artificial limit on string size. I'd post the implementation here, but I'm respecting Scott's implicit copyright. The implementation is on a single slide of his presentation linked to above.

這篇關于在 C++ 中方便地聲明編譯時字符串的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

boost_1_60_0 .zip installation in windows(Windows 中的 boost_1_60_0 .zip 安裝)
How do I get console output in C++ with a Windows program?(如何使用 Windows 程序在 C++ 中獲得控制臺輸出?)
How do I calculate the week number given a date?(如何計算給定日期的周數?)
OpenCV with Network Cameras(帶有網絡攝像機的 OpenCV)
Export all symbols when creating a DLL(創建 DLL 時導出所有符號)
Getting started with OpenCV 2.4 and MinGW on Windows 7(Windows 7 上的 OpenCV 2.4 和 MinGW 入門)
主站蜘蛛池模板: 亚洲国产成人精品久久 | 日韩三级免费观看 | 国产一区二区日韩 | 午夜在线影院 | 日本电影韩国电影免费观看 | 久久久精品久 | 日韩一二三区 | 国产一区二区三区久久久久久久久 | 久草资源在线视频 | 国产精品免费一区二区 | 亚洲一区中文字幕 | 成人精品鲁一区一区二区 | 91精品久久久久久久久久入口 | 天天干天天操天天射 | 日韩视频在线免费观看 | 欧美.com| 欧美一区二区三区四区视频 | 精品亚洲第一 | 日本一区不卡 | 欧美www在线 | 亚洲精品电影网在线观看 | 午夜久久久久 | 91精品一区二区三区久久久久 | 午夜看片网站 | 亚洲精品久久久久久久久久久久久 | 在线免费观看成人 | 免费观看的av毛片的网站 | 国产大毛片| 欧美一区二| 日日综合 | 国产亚洲欧美另类一区二区三区 | 国产99久久精品一区二区300 | 欧美一级欧美一级在线播放 | 亚洲精品成人av久久 | 一区二区在线视频 | 中文字幕在线网 | 成人影院午夜 | 国产在线精品一区二区 | 精品久久久久久久久久久久久久久久久 | 国产日韩一区二区三免费 | 国产精品亚洲一区二区三区在线观看 |