【发布时间】:2015-09-11 06:01:31
【问题描述】:
我在内部就如何支持 C++11 之前的编译器 - Visual Studio 2008 进行了内部辩论。这是为 Windows 2000 机器构建所必需的(不要问!)。
我正在使用一些 C++11 功能,例如 std::to_string、std::mutex 等。目前,我已经能够通过使用boost 和tr1 来编译低级项目,例如:
#if _MSC_VER == 1500
# include <boost/thread/lock_guard.hpp>
using boost::lock_guard;
# include <boost/thread/mutex.hpp>
using boost::mutex;
# include <memory>
using std::tr1::shared_ptr;
#else
# include <mutex>
using std::lock_guard;
using std::mutex;
# include <memory>
using std::shared_ptr;
using std::unique_ptr;
#endif
例如,将源更改为shared_ptr func_name() 而不是std::shared_ptr func_name()。远非完美,毫无疑问很快就会有一些微妙的内部问题需要解决。
我现在正在尝试找出std::to_string,它不能那么容易地适应boost版本(我还没有遇到过的其他类中可能还有更多问题)。
据我所知,我有两种选择:
1) 咬紧牙关,预处理器将所有向后兼容的代码分开。这将使 99% 的时间都不会使用的代码变得丑陋和庞大 - 但实施起来会明显更快。
2) 从 std::string 派生,并根据需要添加缺少的功能。重复其他类/功能。这将需要对不熟悉该项目的人“使用未知类”,以及额外的时间编码来填补这些空白,可能会出现错误,但要成为最干净的解决方案。它也可以用于未来的兼容性修复。
替换每种类型并不是一项艰巨的任务,但我希望尽可能保留原始实现类型,尤其是因为代码也需要在 Linux 和 BSD 上运行。我也没有做任何难以向后移植的疯狂事情(没有元组、lambda 或其他在这种情况下会出现问题的事情)。
以前有没有人做过类似的事情并找到了不错的解决方案?
【问题讨论】:
-
在您自己的实现背后隐藏两种语言标准之间的差异,并将丑陋的东西排除在您的其余代码之外。这适用于您上面描述的内容,但不适用于
auto、基于范围的 for 循环等功能。 -
是的,我已经不得不将一些不错的简单 5 行 for 循环转换为 7/8 行迭代器怪物!如果没有更好的方法可以做到这一点,我想我会把大部分事情都整理好——从长远来看会更好。
标签: c++ c++11 visual-studio-2008 backwards-compatibility