我本来以为我对C++11已经非常了解了,看来还是有遗漏,我们今天讲解一下用户自定义文本,那么什么叫用户自定义文本?
其实就是使用operator关键字在字面量后面加上后缀,仅此而已。
我们打个比方,10u表示unsigned int,或者1.1f表示float,5L表示long int,等等。那么我们也可以自定义,我们先用一段小代码解释这种操作
auto operator "" _i(char i) { std::cout<<i<<std::endl; return static_cast<int>(i); } auto operator "" _i(size_t i) { std::cout<<i<<std::endl; return static_cast<int>(i); }
这样看可能不明白,我们加上使用代码
'A'_i; 65_i;
使用也非常简单,甚至没什么好说的,我们使用operator同一个名字_i进行重载,也会正常按照类型匹配,最后它会打印这个数据,然后转换为int类型(虽然转不转也没啥区别)。
使用非常的轻松简单,对吧?
我们增加一点有趣的难度
void operator "" _dump_raw(const char* lit) { printf("operator \"\" _dump_raw(const char*) : ===>%s<===\n", lit); }; void operator "" _dump_raw(const long double lit) { printf("operator \"\" _dump_raw(const long double) : ===>%Lg<===\n", lit); };
这两个函数,如果使用
42_dump_raw; 3.1415926_dump_raw; 3.14e+25_dump_raw;
你们觉得会如何匹配打印呢?结果如下
operator "" _dump_raw(const char*) : ===>42<=== operator "" _dump_raw(const long double) : ===>3.14159<=== operator "" _dump_raw(const long double) : ===>3.14e+25<===
是不是很有趣,int直接匹配了const char*,其实只要是字面量就能直接匹配char*,哪怕是long double;有兴趣的可以注释试试。我们甚至可以直接使用%s来打印这些所有的字面量
当然,也是有一些别的规则的,比如不能直接使用int double这种类型,operator必须下划线开始,还望详细阅读下面代码
#include <cstddef> #include <cstdio> #include<iostream> // Literal operator for user-defined INTEGRAL literal void operator "" _dump(unsigned long long int lit) { printf("operator \"\" _dump(unsigned long long int) : ===>%llu<===\n", lit); }; // Literal operator for user-defined FLOATING literal void operator "" _dump(long double lit) { printf("operator \"\" _dump(long double) : ===>%Lf<===\n", lit); }; // Literal operator for user-defined CHARACTER literal void operator "" _dump(char lit) { printf("operator \"\" _dump(char) : ===>%c<===\n", lit); }; void operator "" _dump(wchar_t lit) { printf("operator \"\" _dump(wchar_t) : ===>%d<===\n", lit); }; void operator "" _dump(char16_t lit) { printf("operator \"\" _dump(char16_t) : ===>%d<===\n", lit); }; void operator "" _dump(char32_t lit) { printf("operator \"\" _dump(char32_t) : ===>%d<===\n", lit); }; // Literal operator for user-defined STRING literal void operator "" _dump(const char* lit, size_t) { printf("operator \"\" _dump(const char*, size_t): ===>%s<===\n", lit); }; void operator "" _dump(const wchar_t* lit, size_t) { printf("operator \"\" _dump(const wchar_t*, size_t): ===>%ls<===\n", lit); }; void operator "" _dump(const char16_t* lit, size_t) { printf("operator \"\" _dump(const char16_t*, size_t):\n" ); }; void operator "" _dump(const char32_t* lit, size_t) { printf("operator \"\" _dump(const char32_t*, size_t):\n" ); }; // Raw literal operator void operator "" _dump_raw(const char* lit) { printf("operator \"\" _dump_raw(const char*) : ===>%s<===\n", lit); }; template<char...> void operator "" _dump_template(); // Literal operator template int main(int argc, const char* argv[]) { 42_dump; 3.1415926_dump; 3.14e+25_dump; 'A'_dump; L'B'_dump; u'C'_dump; U'D'_dump; "Hello World"_dump; L"Wide String"_dump; u"UTF-16 String"_dump; U"UTF-32 String"_dump; 42_dump_raw; //字面量可以直接匹配const char* 3.1415926_dump_raw; 3.14e+25_dump_raw; system("pause"); }
最后奉上微软参考文档对此的解释用户定义的文本 (C++) | Microsoft Docs
C++11用户自定义文本
最新推荐文章于 2023-06-21 23:54:33 发布