助推.任何获得原始类型
Boost.Any get original type
我需要将any
变量强制转换为原始类型。我需要这样做:
int i = 10;
any a(i);
int& i2 = any_cast<int &>(a);
但我希望类型存储在any
变量中。我写的是:
int i = 10;
any a(i);
a::type_value& i2 = any_cast<a::type_value &>(a); // there is no actually type_value
我怎么能做那样的事?或者如何从any
变量中提取原始类型?Boost.变体也很方便。
如果我不能做到这一点,那么我还有一个问题,C++技术和库可以存储什么,并通过函数获取类型来解决这个问题?
C++是一种静态类型语言。boost::any
的类型是运行时值;任何特定的CCD_ 5可以具有任何类型。这就是重点。
没有any::type_value
,因为它必须是编译时的值。any
是一个运行时结构。
考虑一下:
void TakeAnAny(boost::any a)
{
a::type_value& i2 = any_cast<a::type_value &>(a);
}
any::type_value
是什么类型的?使用几乎的任何类型调用TakeAnAny
都是合法的。any::type_value
不可能简化为单一的编译时类型。因此,编译器无法确定类型。由于C++是静态类型的,因此您已被清除。
任何操作的最终目的都是类型擦除。我有一些价值。我想把它传递给其他函数。这个过程将经过几个不同的通信层。但我不一定想让所有这些不同的层都知道我使用的是什么类型。我只需要我自己和我预定的目的地知道类型。所以你把它放在any
里,你就没事了。其他人只看到any
,你们两个都知道它的包装。
这个过程之所以有效,是因为源和目标都知道值的真实类型。如果您不知道类型,则不应该使用any
。any
的目的不是让一个函数坐在那里,并将其强制转换为一组可能的类型(这就是boost::variant
的作用)。其目的是从函数的签名中删除类型。
这允许诸如通用消息和信号之类的东西。您向系统注册了一些事件处理程序。您激发了一个以any
为参数的事件。触发事件的人知道"MouseClick"事件总是以vec2
作为其参数。因此,每个"MouseClick"处理程序都将其转换为vec2
。"KeyPress"事件可能会通过int32_t
。所以这些处理程序将其强制转换为该类型。等等每个人都知道它实际上是什么类型的。
这以前是用void*
来完成的。问题是您有所有权问题(any
是一个值,而void*
是一个指针)。此外,void*
的类型被擦除,因此无法检查您的强制转换是否正确。CCD_ 24实际上只是一种类型&值安全CCD_ 25;它可以防止您转换为错误的类型。
你并不是真的想要any
。您的用例似乎也不需要variant
。您似乎想要的是一个模板。这是一种不同的东西,它可以让你做你真正想要的事情:拥有一个可以使用任何特定类型的函数,同时仍然能够确切地知道该类型是什么
当然,模板也有其自身的局限性。
您可以使用std::type_info
到std::function<void(boost::any const&)>
对象的映射来处理您知道并且想要处理的类型:您将使用a.type()
定位映射中的条目,并调用相应的函数,该函数将知道如何处理参数。
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 使用字节向量作为其他类型的原始存储是一种好的做法吗
- 为什么重建的地图类型与原始地图类型不同?
- BoostSpirit.Qi-针对原始数据类型进行边界检查
- CAN模板类型推理考虑原始操作类型转换
- 请参阅Watch-Window中的原始类型定义
- 是仅使用get或toplown的原始类型的线程安全性的威胁
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 如何在用户修改后使用旧版驱动程序中的 PE 标头获取原始文件类型
- 用于操作原始内存的正确数据类型
- 如何调节类模板和原始类型模板
- 如何复制包含非原始类型的阵列
- 原始类型的强类型(BOOST_STRONG_TYPEDEF没有切割)
- c中的neo4j-client,在语句中编码的原始类型(即int)
- 幻影类型是否与原始类型具有相同的对齐方式
- 通过参考传递原始类型是适得其反的吗?
- 统一功能使用模板专业化和接口来调用实例和原始类型
- 返回与原始模板类型不同的模板时没有匹配函数
- NDK带有JNI的ndk,使用返回类型的非原始类型调用方法
- 测试与C 原始数据类型上同步锁定的需求