【问题标题】:How to get integer out of Poco::Any如何从 Poco::Any 中获取整数
【发布时间】:2015-07-27 06:43:11
【问题描述】:

我将Poco::Any 与各种整数类型一起使用,例如:

Poco::Any x = 15;
Poco::Any y = (size_t)15;
Poco::Any z = 15L;

稍后我想使用整数值:

void func(Poco::Any &a)
{

如何从中提取任何整数?一种方法是:

long n;
if ( auto *p = Poco::AnyCast<int>(&a) )
    n = *p;
else if ( auto *p = Poco::AnyCast<long>(&a) )
    n = *p;

并为每个整数类型重复。但这很丑陋。有没有更好的办法?

我试过了:

Poco::Dynamic::Var var(a);
auto n = var.convert<int>(var);

但是这会引发来自VarHolder.h 的异常:

virtual void convert(Int32& val) const;
    /// Throws BadCastException. Must be overriden in a type
    /// specialization in order to suport the conversion.

【问题讨论】:

    标签: c++ c++11 poco-libraries


    【解决方案1】:

    Poco::Any(它是boost:any 的一个端口)在类型方面本质上是一条“单向之路”——你可以将任何东西放入其中,但是,当你想获得价值时,你有确切地知道里面是什么;从这个意义上说,any 比 C++ 语言本身更严格。

    DynamicAny(又名Poco::Dynamic::Var)建立在any 基础之上,在数据检索方面“软化”它;它的引入正是为了缓解这种限制。

    请参阅DynamicAny, Part I 以获得更深入的解释:

    虽然它提供了一种动态类型发现的机制(清单 2.), boost::any 本身不参与此类活动,也不愿意在值之间的隐式转换中进行合作 不同的类型。

    所以,如果你想坚持使用 Poco::Any,你将不得不发现其中的内容:

    void func(Poco::Any &a)
    {
      long n;
      if (a.type() == typeid(int))
        n = Poco::AnyCast<int>(a);
      else if (a.type() == typeid(long))
        n = Poco::AnyCast<long>(a);
      // ...
    }
    

    【讨论】:

    • 好的,谢谢。 Dynamic::Var 似乎更适合我尝试做的事情。
    【解决方案2】:

    您需要使用 AnyCastRefAnyCast - 尽管您可以在 Any 周围创建自己的包装类,并实现一个新方法,如果您不喜欢使用 typedef 或以上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2019-08-09
      • 2020-06-03
      • 2015-09-14
      相关资源
      最近更新 更多