问题标签 [stdany]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 不能用c++中的库
描述
我是 C++ 新手。我的项目需要使用任何库,这是 c++ 17 之后的一个新功能。在按照这个链接更新我的编译器之后。我仍然遇到错误。这是错误消息和我的测试代码。
g++ 版本:
g++ (Ubuntu 6.5.0-2ubuntu1~16.04) 6.5.0 20181026
版权所有 (C) 2017 Free Software Foundation, Inc.
这是免费软件;查看复制条件的来源。没有
保修;甚至不考虑适销性或特定用途的适用性。
代码
编译
错误信息
c++ - 这是带有 std::any 或 std::is_copy_constructible 的 libstdc++ 中的错误,还是合法错误?
我遇到了一个相当麻烦的情况,我试图将 std::make_any 与我编写的类一起使用,该类在其构造函数之一中接受 std::any ,但试图提出一个最小的测试情况下,我认为这可能是 std::any 和/或 std::is_copy_constructible 实现中的一个错误,但我不能 100% 确定。以下是一些使用 g++8 和 clang++9 不同地工作或不工作的最小示例。在每个示例中,所有相同的代码行都存在,但有两行是否被注释掉的 4 种状态,以及结果。
我正在使用 C++17 标准,将-std=c++17
标志传递给 g++-8 和 clang++-9,它们都使用 libstdc++ 版本 8.3.0(Ubuntu 18.04)。
以下使用 g++-8 和 clang++-9 编译。
正如人们所期望的那样,以下内容也适用于两者。
以下使用 g++-8 编译,但使用 clang++-9 编译失败。这很令人困惑,因为std::is_copy_constructible_v<Hippo>
不应通过添加与复制构造无关的构造函数来更改 的值。
clang++-9 给出的错误是(剪裁长度):
在这里,看起来std::is_copy_constructible<Hippo>
类型在使用点(在<any>
标头内)不完整,但它应该有一个布尔值的 constexprvalue
成员。这就是我认为的错误,因为 g++8 可以很好地编译它。据推测,该错误存在于 libstdc++ 的 std::any 和/或 std::is_copy_constructible 实现中,但由于 g++-8 有效而 clang++-9 失败,这令人困惑。
但是,以下代码在 g++-8 和 clang++-9 中都无法编译:
不出所料,clang++-9 产生的错误是相同的,但来自 g++-8 的错误声称对于 std::any 的构造函数,模板参数推导的所有候选者都失败,包括应该工作但埋在该构造函数中的构造函数是std::is_copy_constructible 的使用,所以我认为这是同样的问题,我很确定这是一个错误。我已经删除了错误消息中不相关的部分:
无论如何,我的问题是——这是 libstdc++ 中的一个错误,对吧?
c++ - 如何在 C++17 任何向量中查找数据类型?
我正在尝试查找任何类型向量的元素的数据类型。
我尝试了以下代码:
输出如下:
如您所见,int
andbool
被正确识别,但字符串类型返回其他内容。此外,所有复杂的 C++ 数据结构以及向量和映射等都会发生这种情况。有没有办法检测特定的数据类型?
list
我的最终目标是在 python中实现自定义向量数据类型,例如 a 。具有基本的推送和获取功能。
c++ - 如何打印使用“std::any”类型的变量插入的字符串向量的元素
这是我的 C++ 代码的主要功能。
这给了我这样的错误:
c++ - 是否可以为 std::any-like 容器转发具有匹配模板类型的函数调用?
我还没有找到实现我想要的方法,但我没有足够的知识知道它是否不可能。帮助将不胜感激。
我们软件中的主要数据数据容器的行为有点像 std::variant 或 std::any:它有一个BaseContainer
提供类型枚举的基类。派生实例DataContainer
将实际数据保存在类型化张量成员变量中。所以一个简化的例子可以归结为这样的:
我们有许多基于底层模板化类型和维度处理数据的方法:
问题是,对于processData()
我们想用 a 调用的每个方法BaseContainer
,我们需要编写一个绑定方法来解开可能的类型以调用 的类型化版本processData()
:
我的问题是:是否可以制作一个单一的“适配器”方法(在任何已发布的 c++ 版本中),它可以采用函数(如processData()
)、BaseContainer 和可能的参数列表,并调用此函数的正确模板绑定与论点?
我未能动态绑定模板函数,因为我无法在没有模板类型的情况下传递名称。然而,模板类型需要基于 BaseContainer 是动态的。但也许还有其他方法可以实现我想做的事情?我对任何解决方案都非常好奇,主要也是为了扩展我的理解,只要解决方案的复杂度低于编写数百个适配器方法即可。
如果不出意外,是否可以使用预处理器宏生成“适配器”方法?
c++ - 在没有 RTTI 的情况下检查 std::any 的类型
我正在使用std::any
RTTI 并禁用异常。它可以工作并且std::any_cast<T>()
能够检测类型是否正确,如std::any 中所述,没有 RTTI,它是如何工作的?. std::any::type()
虽然没有 RTTI 被禁用。
我想检查我的std::any
对象是否包含给定类型的值。有没有办法做到这一点?
c++ - `auto` 和 `std::any` 有什么区别?
我最近遇到了这个std::any
类,在 C++17 中引入,基于boost::any
. 这个类可以“持有任何类型的实例”并auto
自动推导出变量的数据类型。
那么主要区别是什么?优缺点都有什么?
c++ - std::any 包含 std::tuple编译失败
我意识到嵌套的 std::any 是个坏主意。尽管如此,我遇到了一些让我摸不着头脑的事情,我只是想了解编译器为什么会窒息。考虑以下代码行(假设arg
变量是包含另一个 std::any 的 std::any):
那行编译得很好。现在,考虑这一行,其中我有一个 std::any 包含一个 std::tuple 包含另一个 std::any:
现在,编译器崩溃了。这些是我得到的错误:
我很难解开所有这些并找出问题所在以及如何解决它。
编辑:我们在评论中发现此代码不能在 G++ 9 及更低版本下编译,但在 G++ 10 及更高版本上编译,并且在 clang 10 及更低版本上也失败,但在 clang 11 及更高版本上编译。有没有人猜测为什么会这样?
c++ - 为什么 std::any 实现使用 typeid?
即使使用 -fno-rtti 编译,它似乎在 GCC 和 Clang 中也能std::any
正常工作。
在查看 libc++ 源代码时,我发现他们只是使用了一个简单的技巧:
他们获取在任何类型上模板化的变量的地址,这就是他们获得唯一ID的方式。
但是这个代码只有在没有打开 RTTI 时才有效。
这让我想知道。为什么他们甚至首先使用 RTTI?为什么不总是使用这个解决方案?我不知道为什么typeid
会比简单的指针(指向每个类型实例化的静态变量)比较快。