助推.任何获得原始类型

Boost.Any get original type

本文关键字:类型 原始 任何获 助推      更新时间:2023-10-16

我需要将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,你们两个都知道它的包装。

这个过程之所以有效,是因为源和目标都知道值的真实类型。如果您不知道类型,则不应该使用anyany的目的不是让一个函数坐在那里,并将其强制转换为一组可能的类型(这就是boost::variant的作用)。其目的是从函数的签名中删除类型。

这允许诸如通用消息和信号之类的东西。您向系统注册了一些事件处理程序。您激发了一个以any为参数的事件。触发事件的人知道"MouseClick"事件总是以vec2作为其参数。因此,每个"MouseClick"处理程序都将其转换为vec2。"KeyPress"事件可能会通过int32_t。所以这些处理程序将其强制转换为该类型。等等每个人都知道它实际上是什么类型的。

这以前是用void*来完成的。问题是您有所有权问题(any是一个值,而void*是一个指针)。此外,void*的类型被擦除,因此无法检查您的强制转换是否正确。CCD_ 24实际上只是一种类型&值安全CCD_ 25;它可以防止您转换为错误的类型。

你并不是真的想要any。您的用例似乎也不需要variant。您似乎想要的是一个模板。这是一种不同的东西,它可以让你做你真正想要的事情:拥有一个可以使用任何特定类型的函数,同时仍然能够确切地知道该类型是什么

当然,模板也有其自身的局限性。

您可以使用std::type_infostd::function<void(boost::any const&)>对象的映射来处理您知道并且想要处理的类型:您将使用a.type()定位映射中的条目,并调用相应的函数,该函数将知道如何处理参数。