25.C++11 用户定义的文本运算符:基本用法与注意事项

一、前言

文本运算符是C++11推出的一项语法特性,并没有任何性能优势或劣势。

它们的主要作用在于方便实现编译时的类型推断,说直白点就是,通过文本运算符可以使得我们能够快速构建出一个自定义对象。

虽然用到它的地方并不多,但文本还是对其稍稍进行介绍一下。

二、基本使用

官方文档可以查询:用户定义的文本

简单来说就是有以下类型的文本类型可以使用operator关键字进行重载:

ReturnType operator "" _a(unsigned long long int);   // Literal operator for user-defined INTEGRAL literal
ReturnType operator "" _b(long double);              // Literal operator for user-defined FLOATING literal
ReturnType operator "" _c(char);                     // Literal operator for user-defined CHARACTER literal
ReturnType operator "" _d(wchar_t);                  // Literal operator for user-defined CHARACTER literal
ReturnType operator "" _e(char16_t);                 // Literal operator for user-defined CHARACTER literal
ReturnType operator "" _f(char32_t);                 // Literal operator for user-defined CHARACTER literal
ReturnType operator "" _g(const char*, size_t);      // Literal operator for user-defined STRING literal
ReturnType operator "" _h(const wchar_t*, size_t);   // Literal operator for user-defined STRING literal
ReturnType operator "" _i(const char16_t*, size_t);  // Literal operator for user-defined STRING literal
ReturnType operator "" _g(const char32_t*, size_t);  // Literal operator for user-defined STRING literal
ReturnType operator "" _r(const char*);              // Raw literal operator
template<char...> ReturnType operator "" _t();       // Literal operator template

看着有点奇怪,但举个例子你应该就明白了:

#include<iostream>
using namespace std;

class Person
{
public:
	string _name;
	Person(const std::string& name) : _name(name) {}
};

Person operator"" _name(const char* name,size_t len) {
	return Person(name);
}

int main()
{
	auto person = "Xiao Ming"_name;

	std::cout << "The person' name is " << person._name << std::endl;
	return 0;
}

上面的代码可以分为三个部分。

  1. 第一部分是自定义类
  2. 第二部分是重载文本运算符
  3. 第三部分是main函数中对它的使用

这里重点在第二部分:

Person operator"" _name(const char* name,size_t len) {
	return Person(name);
}

通过operator关键字重载""这个文本运算符、并命名为_name,后面的参数类型则是前面所列举的那些,这里代表的是字符串类型。

然后在使用的时候,通过给字符串添加一个后缀,也就是我们这里取的名字:

auto person = "Xiao Ming"_name;

那么就会用前面这个字符串作为参数去调用上方的函数,在函数内部构造出一个自定义对象并返回。

这就是它的基本用法,但并不仅仅是字符串,数字、字符等都是可以的,也并不一样非要构造一个自定义对象,完全可以用它来完成简化的进制转换:

#include<iostream>
using namespace std;

int operator"" _ms(unsigned long long int t) {
	return t / 1000;
}

int main()
{
	int s = 100000_ms;
	cout << s;
}

比如这里,名字为_ms,也就是毫秒的意思,返回的结果则为秒,用起来就会非常的简洁。

三、注意事项

虽然它用起来和简单,但也要有一些注意事项。

首先就是可重载的文本运算符是有限的,也就是前面列举出来的那些,参数也都是固定的。

你并不能使用其它的参数,比如:

int operator"" _ms(int t) {
	return t / 1000;
}

因为没有参数为int类型的,所以上面这段代码是无效的。

至于名字前面的_并不是必要的,但一般来说推荐加上。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux