C++11用户自定义文本

我本来以为我对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值