C++11用户自定义文本

C++11用户自定义文本,第1张

我本来以为我对C++11已经非常了解了,看来还是有遗漏,我们今天讲解一下用户自定义文本,那么什么叫用户自定义文本?

其实就是使用operator关键字在字面量后面加上后缀,仅此而已。

我们打个比方,10u表示unsigned int,或者1.1f表示float,5L表示long int,等等。那么我们也可以自定义,我们先用一段小代码解释这种 *** 作

auto operator "" _i(char i)
{
    std::cout<(i);
}
auto operator "" _i(size_t i)
{
    std::cout<(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 
#include 
#include

// 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 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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/874719.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存