0

我已经使用boost了一段时间,但仍然是新手。我想我爱上了,boost::any因为我不再需要使用模板来处理使用或返回的类型化对象。然而,我觉得对我来说仍然不方便的一件事是更平滑的功能或方法,如果有的话,可以held简洁地来回传输其数据,并且以后肯定不会使用cast_any.

习俗

(case 1)
boost::any a="123456";
std::string s=boost::cast_any<std::string>(a);
(case 2)
boost:any a=123456;
int i=boost::cast_any<int>a;

自定义 boost_any:

(case 1)
boost:any a="123456";
std::string s=a;
(case 2)
boost:any a=123456;
int i=a;

我喜欢这个功能,因为在调试我的程序期间,我发现这held="123456"两种情况下的对象完全相同。我thinklib 的内部实现可能已经做到了(将它保存的内容转换为string)。此示例仅显示 POD 类型,我想知道是否有人对此自定义进行了任何操作或为我消除cast_any.

4

2 回答 2

0

Boost.Any 是一个专门的工具,通常用于在库类型中隐藏用户提供的数据。它不是一个通用的“忘记类型,我有任何”系统。它不是那样工作的,因为最终你无论如何都必须转换为特定类型。

隐藏any_cast隐式转换是一个坏主意,因为如果存储了错误的类型,它会抛出。在一个简单的任务中拥有它将是难以发现的错误的重要来源。

无论如何,调试支持any与任何真实代码完全分开,不会帮助您实现您想要的。如果你真的想要隐式转换,你需要在any类中添加一个模板化的转换运算符。any但我强烈建议不要这样做,一般来说不要过度使用。在大多数情况下,它实际上并没有帮助,或者其他解决方案更好。不要害怕模板。

于 2015-06-29T08:23:21.627 回答
0

boost::any以 C++ 的类型安全精神实现。运行时效率和强类型是其设计背后的约束。虽然它提供了一种动态类型发现的机制,boost::any但它本身并不参与这种活动,也不愿意在不同类型值之间的隐式转换中进行合作。

无论如何,还有其他实现any(例如Poco::DynamicAny)扩展boost::any功能(在可能/安全的情况下隐式转换为目标类型和许多其他功能)。

关于这个主题的一篇非常有趣的文章是DynamicAny (Overload Journal #86 - August 2008 - Aleksandar Fabijanic)

于 2015-06-29T08:30:23.493 回答