一、前言
文本运算符是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;
}
上面的代码可以分为三个部分。
- 第一部分是自定义类
- 第二部分是重载文本运算符
- 第三部分是
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
类型的,所以上面这段代码是无效的。
至于名字前面的_
并不是必要的,但一般来说推荐加上。