gpt4 book ai didi

c++ - 用于在 auto_ptr 和 unique_ptr 之间切换的宏

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:09 25 4
gpt4 key购买 nike

在一个仍然使用 C++11 之前版本的项目中,我想通过使用 C++11 编译器进行编译并修复错误来为切换准备源代码。它们包括

  • std::auto_ptr<T> 的实例替换为 std::unique_ptr<T>
  • 必要时,用std::move()包裹智能指针
  • 一些0NULL替换为 nullptr

现在我想切换回 C++ 之前的编译器并编写一个可以切换回更改的宏,这样,当最后的编译器切换时间到了时,我只需删除宏。我试过了

#ifndef HAVE_CXX11
#define nullptr NULL
namespace std {
#define unique_ptr<exvector> auto_ptr<exvector>
}
#endif

(使用 exvector 与智能指针一起使用的示例类型)这个和类似的尝试不起作用,因为宏不能更改模板类型。我也用过 typedef没有更好的结果。

这是否可能,如果可能,如何实现?

最佳答案

我会引入非常明确的宏,比如

//Defines to overcome pre C++11 limitations regarding 
//std::auto_ptr and absence of 'good' move (i.e. std::move) semantics.
//Strictly post C++11 code should use std::unique_ptr and std::move explicitly.
//All other code should use the macros.
//If pre-C++11 ceases to be a target the macros may be replaced...
#ifdef HAVE_CXX11 //Or whatever...

#define UNIQUE_PTR_TYPE std::unique_ptr
#define MOVE_UNIQUE_PTR(PTR) std::move(PTR)

#else

#define UNIQUE_PTR_TYPE std::auto_ptr
#define MOVE_UNIQUE_PTR(PTR) (PTR)

#endif

为什么?因为即使是不经意的读者也会看到正在进行一些替换。

是的,代码看起来会很丑陋,但安全“不会让任何人的手指都丑陋”。我们是工程师而不是诗人,这就是我们的美!

但是我不得不说,我同意发帖人认为您应该对代码进行分支的观点。这不是唯一的不兼容性,你的代码会变得越来越臃肿,你可能会发现你正在做更多的工作(并引入更多的错误)试图使单个分支多目标而不是分支。

宏是美妙的东西,但任何形式:

#define <common symbol> <something else>

需要 100% 保证良性“您不需要知道它已被替换”才能被宽恕。

我只是不认为:

#define unique_ptr auto_ptr

或者任何其他使这个替换不可见的东西都完全通过了这个测试。unique_ptrauto_ptr 不一样,auto_ptr 被弃用的全部原因是你需要小心使用它。

对于 lulz(回到我关于无形替代品的观点)尝试:

#define if(A) if(((A)&&rand()>128)||rand()>(RAND_MAX-128))

这应该让这些 SCSS 们忙了一下午……最好的一点是你没有用 srand() 播种失败将是可重复的!

关于c++ - 用于在 auto_ptr 和 unique_ptr 之间切换的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30462709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com