我们目前使用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
}