【问题标题】:Compatibility for C++11 code targetting Visual Studio 2008针对 Visual Studio 2008 的 C++11 代码的兼容性
【发布时间】:2015-09-11 06:01:31
【问题描述】:

我在内部就如何支持 C++11 之前的编译器 - Visual Studio 2008 进行了内部辩论。这是为 Windows 2000 机器构建所必需的(不要问!)。

我正在使用一些 C++11 功能,例如 std::to_string、std::mutex 等。目前,我已经能够通过使用boosttr1 来编译低级项目,例如:

#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


【解决方案1】:

由于我没有足够的声誉来发表评论,我会尝试给出答案。

std::to_string 是一个独立的函数,所以不需要派生。根据速度/格式对您的重要性,您可以使用 boost::lexical_cast 或 std::stringstream 实现 my::to_string 模板函数。如果速度真的很重要,您应该投入更多时间并手动创建使用 std::sprintf 的重载。

这里是第一种方式的例子:

#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>

namespace my {
    template<typename T> std::string to_string(T val){
        return boost::lexical_cast<std::string>(val);
    }
}

int main(){
    std::string foo = my::to_string(42.23);
    std::cout << foo << std::endl;
    return 0;
}

作为一般建议,我真的会尝试在一些低级类/文件中隐藏操作系统/编译器特定的东西,并在那里使用你需要的任何东西。但是,请尽量避免应用程序代码中的所有血腥内容。

希望有帮助!

【讨论】:

  • 标记为答案,因为它确实是存在限制的最佳解决方案。然而,我将让 Windows 2000 受到 Visual Studio 支持的影响,如果有人仍然需要它,我需要使用另一个编译器!
  • 我为你能够放弃 VS2008 感到高兴!
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 2016-07-06
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
相关资源
最近更新 更多