gpt4 book ai didi

c++ - 如何使用 typeinfo.name C++ 声明变量

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:33 28 4
gpt4 key购买 nike

我喜欢编码,并且通常使用 Python 来编码,因为它简单而强大。
但是,对于一些关键的程序/任务,我使用 C++。
因此,为了两全其美,我用 C++ 制作了一个 Pythonesque 列表。

AIM:我希望能够添加任何数据类型的任何变量或值,包括用户定义的类
为此,我有一个结构 itemchar * value , 一个 char * type和一个 int size .
我的List有这些 item * 的数组


现在,我已经在模板函数中获取了变量:
template<class T> item * encode(const T& var);
并声明了指向项 item * i = new item; 的指针

并且,我将这些变量的值存储为 C 风格的字符串。
例如,14675二进制是0000 0000 0000 0000 0011 1001 0101 0011
因此,我动态创建了空间,如下所示:
i->size = sizeof(var);
i->value = new char[i->size]; //4 in this case
并使用 var 中的相应位设置值中的每一位。

我也将它们的类型存储为
i->type = typeinfo(var).name();
到目前为止一切顺利!


现在,我卡在 auto decode(item * i) -> decltype(/*What goes here???*/) 上了
如何指定函数的返回类型?
有什么办法吗?
最好使用 i->type ?
或者,我应该改变这个流程的基本设计吗?
提前致谢!

最佳答案

回答你的问题

I would like to be able to add any variable or value of any data type, including classes user has defined.

没有用户的合作,这在 C++ 中是不可能的。

请记住,C++ 类型只是一个编译时概念。它们在运行时不存在。运行时唯一可用的类型信息是 typeid() 提供的 RTTI 薄层。 .像 Python 中那样的运行时鸭子类型是不可能的。

您可以很容易地创建一个包含任意对象的容器。

std::vector<std::any> v;  // requires C++17

但是该容器的用户必须知道什么索引包含什么类型:

if (v[0].type() == typeid(ArbitraryUserType)) {
const auto& item = std::any_cast<ArbitraryUserType>(v[0]);
// work on item ...
}

由于类型的编译时特性,您作为库编写者无法执行 any_cast .它必须在用户的源代码中拼写出来。

一般来说,不要试图将 Python 思维硬塞进 C++。它永远不会有好下场,尤其是当您试图绕过 C++ 最基本的基础之一:其强大的静态类型系统时。

注意事项:

  • 如果没有 C++17,你可以使用 boost::any .
  • 如果你知道编译时可能类型的列表std::vector<std::variant<Type1, Type2, etc>>是一个很好的选择。与 any用户全权负责跟踪他们的类型。因为所有类型检查都发生在运行时,所以编译器无能为力。 Variant另一方面带回了很大一部分编译时安全性。还有 boost::variant作为非 C++17 的替代方案。

编码方法注意事项

基本上,您正在尝试序列化(编码)和反序列化(解码)任意类型。没有这些类型的合作,这是不可能的。

您的方法仅适用于可以一点一点复制的普通类型。 C++ 甚至有一个类型特征:std::is_trivially_copyable .最后,您只支持基本类型和它们的 C 风格结构,但仅此而已。

想象一下 T为你的 encode()功能是std::string .简单地放一个std::string包含指向单独分配的内存块的指针,实际的字符串数据存储在该内存块中。字符串对象本身只是该指针的管理包装器。 encode()仅序列化包装器对象,而不是使用实际数据序列化指向的内存块。

即使在反序列化期间您可以从位流中实例化任意类型,流也不完整。您必须实现的是 Python 的 copy.deepcopy 的 C++ 版本。 ,如果没有每种类型的合作,这是不可能的。看一下 C++ 序列化库——看 Cereal作为一个直接的例子——看看这种合作在实践中会是什么样子。

关于c++ - 如何使用 typeinfo.name C++ 声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53975997/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com