如何使用 C++ 测试功能支持?
How do I test for feature support with C++?
我正在尝试将 ::std::optional<T>
与 g++ 6.3.1 和 -std=c++17 标志一起使用。事实证明我实际上必须 #include <experimental/optional>
并使用 ::std::experimental::optional<T>
来代替。我如何对此进行测试,以便在该功能真正包含在标准库中后我可以包含正确的 header?
有没有我可以给 g++ 的选项,以便它包含 'experimental' 功能,就好像它们是标准功能一样?
简而言之,这里的故事是 gcc 习惯于 "early adopter" 提议包含在即将到来的 C++ 标准修订版中的各种位,但在这些位正式获得之前采用。
当然,不能保证 gcc 中这些位的实现将在最终的 C++ 标准中结束,而无需任何后续调整。因此,在这种情况下,它们被释放为 <experimental/optional>
而不是 <optional>
.
您可以预期此头文件将在 gcc
的未来版本中重命名为 <optional>
,可能需要进行任何最终调整以使其符合 C++ 标准中的最终规范。
直接将您自己的头文件和翻译单元写入 #include <experimental/optional>
而不是 #include <optional>
应该没问题。没有编译器开关可以为您执行此操作。当您将编译器升级到更新版本,实现最终的 C++ 标准规范,并具有实际的 <optional>
头文件时,您只需相应地更新源代码即可。
您还可以在源代码树中放置一个名为 optional
的存根文件,其中仅包含:
#include <experimental/optional>
然后添加一个-I .
编译选项,以便#include <...>
也能在当前目录中查找;然后在您的来源中参考 #include <optional>
。
-I .
会找到这个存根,它会拉入 experimental/optional
。稍后更新 gcc
时,只需删除此文件,然后 -I .
选项。
您可以使用 feature testing recommendations 中的 __cpp_lib_experimental_optional
。
我正在尝试将 ::std::optional<T>
与 g++ 6.3.1 和 -std=c++17 标志一起使用。事实证明我实际上必须 #include <experimental/optional>
并使用 ::std::experimental::optional<T>
来代替。我如何对此进行测试,以便在该功能真正包含在标准库中后我可以包含正确的 header?
有没有我可以给 g++ 的选项,以便它包含 'experimental' 功能,就好像它们是标准功能一样?
简而言之,这里的故事是 gcc 习惯于 "early adopter" 提议包含在即将到来的 C++ 标准修订版中的各种位,但在这些位正式获得之前采用。
当然,不能保证 gcc 中这些位的实现将在最终的 C++ 标准中结束,而无需任何后续调整。因此,在这种情况下,它们被释放为 <experimental/optional>
而不是 <optional>
.
您可以预期此头文件将在 gcc
的未来版本中重命名为 <optional>
,可能需要进行任何最终调整以使其符合 C++ 标准中的最终规范。
直接将您自己的头文件和翻译单元写入 #include <experimental/optional>
而不是 #include <optional>
应该没问题。没有编译器开关可以为您执行此操作。当您将编译器升级到更新版本,实现最终的 C++ 标准规范,并具有实际的 <optional>
头文件时,您只需相应地更新源代码即可。
您还可以在源代码树中放置一个名为 optional
的存根文件,其中仅包含:
#include <experimental/optional>
然后添加一个-I .
编译选项,以便#include <...>
也能在当前目录中查找;然后在您的来源中参考 #include <optional>
。
-I .
会找到这个存根,它会拉入 experimental/optional
。稍后更新 gcc
时,只需删除此文件,然后 -I .
选项。
您可以使用 feature testing recommendations 中的 __cpp_lib_experimental_optional
。