在 Xcode 8.1 中使用 C++17 'any'

Using C++17 'any' with Xcode 8.1

我在 Xcode 8.1 版中使用 C++。我需要使用 boost::any 的功能,但强烈反对将 Boost 的任何部分拉入我们的项目(请不要争论)。

我看到 std::any 是 "merged into C++17" here

我想在我的 Xcode 8.1 项目中使用它。我曾尝试在项目中使用 -std=c++1z 作为自定义标志,但我似乎找不到 header。

如何在我的 Xcode 项目中使用 std::anystd::experimental::any

我可以从实现中下载适当的 header 并将它们放入我的项目源代码中吗?或者,更好的是,在我的 Xcode/Clang/C++?

版本中实际上现在可用

你不能说"I want the default Xcode compiler [which has no support for any]",同时要求它支持any。您也不能为不同的编译器版本混合使用标准库头文件。

你可以

  • 使用提供std::any
  • 的编译器版本
  • 使用任何提供另一种 any 类型的第三方库。

您的安装设置不符合 c++17 标准。 std::any 除非你得到一个至少对你想要的东西有实验支持的编译器,否则你根本无法使用。

Clang Cxx Status

使用 boost::any 可能会好很多。

如果您真的不想使用第三方库,那么创建自己的 any 并不难。我不建议重新发明轮子,但在这种情况下并没有那么困难。

Here's a SO question with an answer showing a way to do 'any'.

通过第三方库将新类型注入 std 是非法的。您可以升级您的编译器,获得您的编译器支持的不同标准库,或者使用在另一个命名空间中提供 any 的第三方库,或者编写您自己的库。

第一次你说不。

第二个很难,因为 xcode 没有宣传其编译器实际上是什么。通常有两个与 clang-llvm 派生编译器一起使用的通用标准库; libc++ 和 libstdc++。即使另一个具有您想要的功能,这种交换往往非常昂贵。

第三个基本上是"use boost"或等价物。

最后一个并不难;几天的工作(主要是事后的错误),基于类似复杂性的编写类型,假设 "good enough" 足够好(即,没有陷入理想的异常保证,或完全匹配标准等)。自然地,实现将需要双曲线的努力来接近完美。

Xcode 现在可以下载 9.0 beta (https://developer.apple.com/download/)。它支持 c++17 标志选项。

编辑:Xcode 9.2 公开可用 std::any 支持。