竹笋

首页 » 问答 » 灌水 » 看完这7条,模拟C新功能只是一个小目
TUhjnbcbe - 2023/8/3 20:53:00
白癜风的医院 http://m.39.net/pf/a_5291113.html

你是否希望,在生产代码中,拥有更高版本的C++?今天很多C++开发人员,用的编译器,都不支持最新版本的标准。其中可能有很多原因,也许你或你的客户,有很多遗留代码需要移植,也许你的硬件,没有足够的基础设施。关键在于,语言提供的最新功能,并不能给大家带来好处,而且很遗憾的是,其中一些功能,肯定会让代码更具表现力。

但是,即使你无法使用这些功能,也不一定要放弃它们的好处。至少不用放弃全部。有一些方法可以使用代码中新功能的思路,更准确地传达你的意图。

当然,这些方法肯定不如使用新版本C++本身的功能那么好,这就是你还是需要更新编译器的原因。但与此同时,我将介绍7种方法来模拟这些功能,以最低的成本改进你的代码。

=default,=delete

在C++11中,=default可以向编译器发出指令生成以下内容之一:

一个默认的构造函数;

一个拷贝构造函数;

一个拷贝赋值运算符;

一个移动构造函数;

一个移动赋值运算符;

一个析构函数。

在某些情况下,编译器无论如何都会生成这些函数。但是对于C++11,一些开发人员喜欢在他们的界面中表现这一点,以向读者保证他们知道这些方法是自动生成的,并且这也是他们想要的类。

在C++11之前没有办法用原生的方法表现这一点。但你照样可以在注释中注明:

classX{/*X(constXother)=default;*//*Xoperator=(constXother)=default;*//*~X()=default;*///restofX...};

类似地,为了阻止编译器生成这些函数,在C++11之前我们不得不将它们声明为private,并且不实现它们:

classX{//restofX...private:X(constXother);Xoperator=(constXother);};

在C++11中,我们可以将它们声明为public,并通过“=delete”禁止编译器生成这些函数。

在C++11之前,我们需要更加明确,不仅需要声明为private,还需要设置“=delete”(但不是真的设置,只是加注释):

classX{//restofX...private:X(constXother)/*=delete*/;Xoperator=(constXother)/*=delete*/;};

标准算法

实用的STL算法库随着新版本C++的出现而不断发展,不断加入新算法。其中一些算法非常泛用。例如copy_if,或all_of,以及其类似的any_of和none_of。

听起来令人惊讶,但在C++11之前它们并不是标准算法。

但是在C++11之前的代码库中访问它们的方法非常简单:只需去某个参考网站(例如cppreference.

1
查看完整版本: 看完这7条,模拟C新功能只是一个小目