如何在std命名空间中引入结构



我们目前使用C++11。C++11中缺少std::optional,它已在C++17中引入。幸运的是,我找到了一个与std::optional接口相同的实现,它可以在C++11中工作(https://github.com/TartanLlama/optional)

这在namespace tl中定义了optional。所以,我可以这样使用它:

#include "optional.hpp"
tl::optional<int> to_int(string str) {
if (...) { return atoi(str); } 
else     { return tl::nullopt; }
} 

然而,我正在寻找一种方法,将其称为std::optional可用:

#include "optional.hpp"
std::optional<int> to_int(string str) {
if (...) { return atoi(str); } 
else     { return std::nullopt; }
} 

这样,当我们切换到C++17时,我就不必用std::optional替换每个tl::optional。我只需要替换";可选.hpp";标题带有:

// optional.hpp 
// ------------
#include <optional.hpp>

今天,这个头被实现为:

// optional.hpp 
// ------------
#include "tl/optional.hpp"   // include the official header, when C++17 is available

如何在该标头中创建某种别名,以便在调用std::optional时它实际引用tl::optional

  • 我无法触摸tl/optional.hpp的原始代码
  • 我宁愿不使用宏

如何在std命名空间中引入结构

通过向标准委员会提交建议书。但在这种情况下,该类已经被采用,所以要获得该类,您需要开始使用新版本的标准。

我如何在这个头中创建某种别名,以便在调用std::optional时,它实际上会引用tl::optional?

由于不是标准的库实现程序,您不允许将类引入std命名空间。

相反,您可以在自己的命名空间中使用一个别名:

namespace my_very_own {
using tl::optional; // change to std::optional when possible
}

最新更新