pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

在 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 入門)
主站蜘蛛池模板: 深圳公司注册-工商注册公司-千百顺代理记账公司 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 合肥办公室装修 - 合肥工装公司 - 天思装饰 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 北京中创汇安科贸有限公司| 北京西风东韵品牌与包装设计公司,创造视觉销售力! | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 新车测评网_网罗汽车评测资讯_汽车评测门户报道 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | 东莞海恒试验仪器设备有限公司 | 浩方智通 - 防关联浏览器 - 跨境电商浏览器 - 云雀浏览器 | 纸塑分离机-纸塑分离清洗机设备-压力筛-碎浆机厂家金双联环保 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 石家庄律师_石家庄刑事辩护律师_石家庄取保候审-河北万垚律师事务所 | 成都思迪机电技术研究所-四川成都思迪编码器 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 | 大鼠骨髓内皮祖细胞-小鼠神经元-无锡欣润生物科技有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 深圳APP开发公司_软件APP定制开发/外包制作-红匣子科技 | 宿舍管理系统_智慧园区系统_房屋/房产管理系统_公寓管理系统 | 广州迈驰新GMP兽药包装机首页_药品包装机_中药散剂包装机 | 论文查重_免费论文查重_知网学术不端论文查重检测系统入口_论文查重软件 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 热处理温控箱,热处理控制箱厂家-吴江市兴达电热设备厂 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 超声骨密度仪-骨密度检测仪-经颅多普勒-tcd仪_南京科进实业有限公司 | 江苏远邦专注皮带秤,高精度皮带秤,电子皮带秤研发生产 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 |