C/C++编程:用户自定义字面量

1059 篇文章 280 订阅

看个例子:

#include <iostream>
using namespace std;

typedef unsigned char uint8;
struct RGBA{
    uint8  r;
    uint8  g;
    uint8  b;
    uint8  a;

    RGBA(uint8 R, uint8 G, uint8 B, uint8 A = 0) :
     r(R), g(G), b(B), a(A){

    }
};

std::ostream & operator << (std::ostream &out, RGBA &col){
    return std::cout << "r: " << (int)col.r
        << ", g: " << (int)col.g
        << ", b: " << (int)col.b
        << ", a: " << (int)col.a << "\n";
}


void blend(RGBA & col1, RGBA &col2){
    std::cout << "blend\n" << col1 << col2 << "\n";
}

int main(){
    RGBA col1(255, 240, 155);
    RGBA col2({15, 255, 10, 7});
    blend(col1, col2);
}

如上,我们相对两个确定的RGBA值进行运算,必须先声明两个变量并赋值,然后再传值给blend。但是再编写测试用例的时候,常会遇到需要声明很多RGBA值,那么像这样的声明变量--传值运算就很麻烦了。解决方法:

#include <iostream>
using namespace std;

typedef unsigned char uint8;
struct RGBA{
    uint8  r;
    uint8  g;
    uint8  b;
    uint8  a;

    RGBA(uint8 R, uint8 G, uint8 B, uint8 A = 0) :
     r(R), g(G), b(B), a(A){

    }
};

RGBA operator ""_C(const char *col, std::size_t n){
    const char *p = col;
    const char *end = col + n;
    const char *r, *g, *b, *a;
    r = g = b = a = nullptr;
    for(; p != end; ++p){
        if(*p == 'r') r = p;
        else if(*p == 'g') g = p;
        else if(*p == 'b') b = p;
        else if(*p == 'a') a = p;
    }

    if((r == nullptr) || (g  == nullptr) || (b == nullptr)){
        throw ;
    }else if (a == nullptr){
        return RGBA(atoi(r + 1), atoi(g + 1), atoi(b + 1));
    }else{
        return RGBA(atoi(r + 1), atoi(g + 1), atoi(b + 1), atoi(a + 1));
    }
}

std::ostream & operator << (std::ostream &out, RGBA &col){
    return std::cout << "r: " << (int)col.r
        << ", g: " << (int)col.g
        << ", b: " << (int)col.b
        << ", a: " << (int)col.a << "\n";
}


void blend(RGBA && col1, RGBA && col2){
    std::cout << "blend\n" << col1 << col2 << "\n";
}

int main(){
    blend("r255 g240 b155"_C, "r15 g255 b10 a7"_C);
}

上面声明了一个字面量操作符RGBA operator ""_C(const char *col, std::size_t n)函数。这个函数会解析以_C为后缀的字符串,并返回一个RGBA的临时变量。blend函数就可以通过右值引用获得这些临时值并进行计算了。也就是说,使用自定义类型的字面常量进行计算、

 

另外,后缀声明也可以用于数值, 比如用60w,100w表示功率,50Kg表示质量等:

#include <iostream>
using namespace std;

struct Waitt{
    unsigned int  v;
};

Waitt operator ""_w(unsigned long long  v){
    return {(unsigned int ) v};
}
int main(){
    Waitt capacity = 1024_w;
}

除了整型数,还可以用于浮点型数字等字面量。

 

C++中,标准要求的字面量操作符有一定的规则,该规则跟字面量的“类型”密切相关:

  • 如果字面值是整型数,那么字面量操作符函数只可接受unsigned long long或者const char*为其参数。当unsigned long long无法容纳该字面量时,编译器会自动将该字面量转换为、0为结束符的字符串,并调用以const char*为参数的版本处理
  • 如果字面值是浮点型,那么字面量操作符函数只可接受unsigned double或者const char*为其参数。当unsigned double无法容纳该字面量时,编译器会自动将该字面量转换为、0为结束符的字符串,并调用以const char*为参数的版本处理
  • 如果字面值是字符串,那么字面量操作符函数只可接受unsigned char* , size_t为其参数(已知长度字符串)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值