Boost.Any得到原始类型

Kro*_*ron 8 c++ boost types

我需要将any变量转换为原始类型.我需要这样做:

int i = 10;
any a(i);
int& i2 = any_cast<int &>(a);
Run Code Online (Sandbox Code Playgroud)

但我希望类型存储在any变量中.我写这个:

int i = 10;
any a(i);
a::type_value& i2 = any_cast<a::type_value &>(a); // there is no actually type_value
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?或者我如何从any变量中提取原始类型?Boost.variant也很方便.

如果我不能这样做,那么我还有另一个问题,C++技术和库可以存储什么,并通过函数获取类型来解决这个问题?

Nic*_*las 16

C++是一种静态类型语言.a的类型boost::any运行时值; 任何特定的any都可以有任何类型.这有点重要.

没有any::type_value,因为那必须是编译时间值.并且any是运行时构造.

考虑一下:

void TakeAnAny(boost::any a)
{
  a::type_value& i2 = any_cast<a::type_value &>(a);
}
Run Code Online (Sandbox Code Playgroud)

什么类型any::type_valueTakeAnAny几乎任何类型的呼叫都是合法的.没有单一的编译时类型any::type_value可以减少到.因此,编译器无法确定类型.由于C++是静态类型的,所以你就被软管了.

任何一个的最终目的是类型擦除.我有一些价值.我想把它传递给其他一些功能.此过程将通过几个不同的通信层.但我不一定希望所有这些不同的层确切地知道我正在使用的是什么类型.我只需要自己和我想要的目的地来了解类型.所以你坚持下去any,你很好.其他人只看到了any,你们两个都知道它包装的内容.

此过程仅起作用,因为源和目标都知道值的实际类型.如果您不知道类型,那么您不应该使用any.目的any是没有函数坐在那里并将其转换为一堆可能的类型(这就是为什么boost::variant).目的是从函数的签名中删除类型.

这允许通用消息和信号之类的东西.您在系统中注册了一些事件处理程序.您触发一个any以参数为参数的事件.触发事件的人知道"MouseClick"事件总是vec2以其参数为参数.所以每个"MouseClick"处理程序都将它转换为vec2."KeyPress"事件可能会通过int32_t.所以那些处理程序将它转换为该类型.等等.每个人都知道它实际需要什么类型.

过去常常这样做void*.问题是你有所有权问题(any是一个值,void*而是一个指针).此外,a void*是如此类型擦除,没有办法检查你的演员是否正确.any真的只是一种类型和价值安全void*; 它可以防止你输入错误的类型.

你真的不想要any.您的用例似乎也不想要variant.你似乎想要的是一个模板.这是一种不同的东西,这将让你做你真正想要的:具有可以使用任何特定类型,同时仍然能够正是类型是什么知道的功能.

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