问题标签 [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.

0 投票
2 回答
67 浏览

c++ - std::any 引用的可变对象

只有修改而不是替换存储的对象的方法std::any是声明可变数据可变吗?例如,为了避免创建和复制 S 类实例:

0 投票
0 回答
35 浏览

c++ - 在保持多态行为的同时从子类中的不同属性列表中一般地访问数据

通过使用常量表达式、参数包、lambda、移动语义、标准容器和 std::any,我可以轻松地创建以下设计模式:

这将创建一个任意的属性或属性列表,而无需定义一个structclass对象。

简单地说,它可以通过以下方式使用:

现在,要访问此容器中的类型安全数据,必须提前知道每个元素的类型,并且必须以下列方式提取它们:

好吧,这很简单,也很公平......

假设我想在类层次结构中加入某种机制,例如这种机制,以保留多态行为......

在类层次结构中,我可能希望拥有一个所有类型都派生自的抽象基类型。对于每个派生类或子类,它们可能包含一组描述其行为或状态的属性或属性,但是,每个子类可能具有不同数量的具有各种不同类型的属性...

例如:

现在,我没有在这里展示任何多态行为、虚拟或纯虚拟方法,因为它们对于我将简要介绍的问题的意图不是必需的......在其他一些代码中的其他地方正在创建这些对象并且然后人口...

很简单......现在,正如我上面所说,访问这些向量中的值std::any需要你type提前知道,以便以某种方式std::any_cast提取它的值。type-safe

假设我计划在解析文件时使用它来创建和填充我的类数据类型及其属性。然后在其他一些函数或代码块的其他地方,需要访问这些元素,我不知道它们的类型是什么......std::any在这种情况下不提供任何设施,也不帮助我完成这个过程。

如果用户不types提前知道并且需要在type-safe上下文中访问这些值,是否有一种简单的方法可以使用上述当前实现自动执行此检索或提取过程?如果没有,可以做些什么来修改上述代码以使其按预期工作,或者是否有任何其他机制或构造可以用来代替它来实现类似的设计模式,同时保留或提供我拥有的行为表达?

0 投票
1 回答
234 浏览

c++ - 与 std::function 类似,但具有更多不同的参数和返回类型

我正在寻找一种方法来设置和调用具有任意参数和返回类型的函数。一个用例是高级脚本。像这样的东西:

我做了一个简化的例子:

https://godbolt.org/z/rMcTo9

这行得通,但我想知道是否有更简单或更直接的方法。

此外,困扰我的一件事是需要将多态类型(即派生类的对象)转换为正确的基类才能正常工作(参见obj2示例)。有没有解决的办法?

注意:示例是故意简化的(std::vector用于参数,std::map用于查找,这些只是概念上的替代品)。

编辑:似乎需要更多信息。

这是“模型驱动架构”(MDA)的一部分(不是 OMG 变体——我们的解决方案比它早了大约 6 年)。我们有自己的 OOP/4GL 语言“V”,我们在 1995 年创建。它在运行时保留所有元信息。这使我们能够动态生成所有 GUI、数据库设计、数据绑定、脚本界面。在其他语言中,这被称为“反射”,但与我们可以做的相比,Java&Co 中可用的功能非常有限。

MDA 意味着(在许多其他事情中)我们需要一种将控制从解决方案的动态“模型驱动”部分转移到实际应用程序逻辑(即功能)的方法。我们拥有的内置脚本语言只是众多用例之一,我认为它对于普通观众来说是最容易理解的。

原始数据类型的数量是有限的,而多态数据类型有数千种。std::any看起来更优雅,std::variant因为a)它有这种酷但完全透明的堆优化,(即小型数据类型不需要动态分配)和b)我们可以保持数据类型之间的关注点分离不变,即所有std::any处理代码可以保持不变,如果我们添加了一个新的数据类型。但如果 有重要的优势std::variant,我愿意考虑。

0 投票
1 回答
58 浏览

c++ - std::any_cast 是否调用析构函数?演员阵容如何?

在每个 any_cast 之后调用的析构函数。并且,下面的代码会导致运行时错误。我认为原因是 any_cast(C) 的工作管道可能就像 ~C() then X(C) ERROR!!C doesn't exist any_cast 真的那样工作吗?

我添加了打击代码并产生了运行时错误。

0 投票
2 回答
142 浏览

c++ - 如何正确检查 any_cast 可用?

我有一些输入,可以是简单的值或容器,包装在std::any. 我不想使用异常,所以我调用返回指针或任何值的noexcept可变参数方法。any_castnullptr

我可以验证任何可用的演员表,typeid()但我不想使用它并想找到一些替代品。一些 typetraits 方法,例如decltype,declval等等。或者干脆使用std::optional.

但在这种情况下,可选似乎仍然潮湿且不稳定。MSVC 编译器程序在运行时中断std::optional源代码的深处。

实际上,类型特征检查将是测试any_cast可能性的最佳方法。但我仍然对 C++ 元编程感到困惑。

0 投票
1 回答
152 浏览

c++ - 来自 std::any 的足够哈希

C++ 中是否有足够的方法从 std::any 存储的数据中提取哈希?好吧,或者至少是字节列表形式的对象及其长度

0 投票
1 回答
234 浏览

c++ - C++:检查存储在 std::any 中的值是否是整数

存储了一个值std::any,我想知道它是整数值(char, short, int, long,有符号和无符号)还是浮点值(float, double)或其他值。

如果我只需要检查int值,我会这样做:

if (a.type() == typeid(int) || a.type() == typeid(signed char)...)但是为C++ 中的所有整数类型做一个巨人似乎......很糟糕。

如果我可以以某种方式访问​​类型,我可以使用is_arithmetic<T>from但我没有,我只有which 返回。type_traitsTstd::any#type()std::type_info

有没有一种方法可以在条件中没有很多很多分离的情况下实现这一点if

(如果重要,我使用 C++20)

0 投票
1 回答
162 浏览

c++ - 如何获取 std::any 变量的数据类型?

你怎么能得到类型var

例如:

输出:

0 投票
0 回答
248 浏览

c++ - How to iterate an `std::array` with `std::any` value type?

How to iterate an std::array with std::any value type. Suppose we don't use the std::tuple and std::get but only a std::array<std::any, SIZE>.

I have declared it:

I could print like this without a loop:

The output:

How about this?

How can I achieve this thing to print exactly the same as the first one without the help of std::tuple but can use some other vocabulary types such as std::variant and also the power of generic programming? Is it possible?

0 投票
1 回答
94 浏览

c++ - CRTP used with std::any vs virtual functions

I am trying to create a compile time polymorphism design that will not require virtual functions with all their drawbacks. However I am struggling with creating simple, effective and easy to understand container that can simulate the ability to hold derived class in it's base class container. My previous attempts with compile time variadic vectors were working, but the code was huge mess. This solutions seems cleaner to me. I have simple code that implements basic CTRP. However I created a runtime container that is storing std::any objects and then based on the type of the object, I can define the action that is supposed to be taken. I have few questions.

  1. How does the usage of std::any and subsequent any_cast<>() hinder the performance compared to the usage of virtual functions?

  2. Is the usage of std::any valid in this situation?

  3. Is there a better way to implement such container?

  4. Is there a way to force implementation as it is with virtual functions (by using virtual <type> foo() = 0)?

  5. Is it a good idea to create an object that will be a CRTP handler? So I will not have a function for CRTP call, but an object, that can manage those calls?

Thank you.

Here is the base class:

Here is the implementation:

Here's the container:

Here's the main: