7

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

我看到这std::any是“合并到 C++17” here

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

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

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

4

4 回答 4

6

你不能说“我想要默认的 Xcode 编译器 [它不支持any]”并同时请求它支持any. 您也不能为不同的编译器版本混合标准库头文件。

你可以

  • 使用提供std::any
  • any使用提供另一种类似类型的任何第三方库。
于 2016-12-11T20:51:49.170 回答
2

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

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

于 2017-06-28T04:53:57.587 回答
2

您的安装设置没有 c++17 标准。std::any除非您获得至少对您想要的东西具有实验性支持的编译器,否则您根本无法使用。

Clang Cxx 状态

boost::any只是使用可能,你会有更好的运气。

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

这是一个 SO question,其答案显示了一种方法来做 'any'

于 2016-12-11T21:03:08.947 回答
2

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

第一个你说不。

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

第三个基本上是“使用boost”或等效的。

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

于 2016-12-11T21:16:00.200 回答