将 boost 类型擦除类型转换回原始类型给了我 boost::bad_any_cast

Posted

技术标签:

【中文标题】将 boost 类型擦除类型转换回原始类型给了我 boost::bad_any_cast【英文标题】:converting boost type erased type back to original type gives me boost::bad_any_cast 【发布时间】:2018-05-09 09:01:03 【问题描述】:

我是增强类型擦除的新手,在将对象转换回其原始类型时遇到问题。根据我对 boost 文档的理解,我应该能够使用 boost::any_cast 将类型擦除的对象转换回其原始类型,但以下代码因 bad_any_cast 异常而失败。我究竟做错了什么? 非常感谢!

https://www.boost.org/doc/libs/1_67_0/doc/html/boost/any_cast.html

BOOST_TYPE_ERASURE_MEMBER((has_x), x, 0)

namespace bte = boost::type_erasure;
using xConcept = boost::mpl::vector<has_x <float(), bte::_self> ,
                                                    bte::copy_constructible<>,
                                                    bte::relaxed>;

using AnyXobject = bte::any<xConcept, bte::_self>;

struct xThing
  float x()
    return 4.;
  
  float y()
    return 5.;
  
;

int main()
  // instance of concrete implementation
  xThing i; 
  // using concrete implementation to construct type erased object
  AnyXobject xconc(i); 
  // calling x() correctly prints 4
  std::cout << xconc.x() << std::endl; 

  // converting back to concrete implementation fails with boost::bad_any_cast at runtime
  auto j = boost::any_cast<xThing>(xconc);
  return 0;

【问题讨论】:

你不应该使用 bte::any_cast 吗? 它确实必须像您的建议一样简单,我希望您是对的,但是 boost::type_erasure 不包含 any_cast boost.org/doc/libs/1_55_0/boost/type_erasure/any_cast.hpp 我的立场是正确的...非常感谢! 【参考方案1】:

您需要致电boost::type_erasure::any_cast

这是更正后的程序:

#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/any_cast.hpp>
#include <boost/type_erasure/member.hpp>
#include <iostream>

BOOST_TYPE_ERASURE_MEMBER((has_x), x, 0)

namespace bte = boost::type_erasure;
using xConcept = boost::mpl::vector<has_x <float(), bte::_self> ,
bte::copy_constructible<>,
bte::relaxed>;

using AnyXobject = bte::any<xConcept, bte::_self>;

struct xThing
    float x()
        return 4.;
    
    float y()
        return 5.;
    
;

int main()
    // instance of concrete implementation
    xThing i;
    // using concrete implementation to construct type erased object
    AnyXobject xconc(i);
    // calling x() correctly prints 4
    std::cout << xconc.x() << std::endl;

    // converting back to concrete implementation fails with boost::bad_any_cast at runtime
    auto j = bte::any_cast<xThing>(xconc);
    return 0;

【讨论】:

以上是关于将 boost 类型擦除类型转换回原始类型给了我 boost::bad_any_cast的主要内容,如果未能解决你的问题,请参考以下文章

swift类型擦除的定义-swift的类型擦除只是一个类型高低阶转换的游戏。

泛型(10)-泛型擦除与转换

Java8基础知识泛型的约束与局限性

将第一列数据类型从 float 转换为 int,并写回原始 csv 文件 [重复]

Java中的类型擦除与桥方法

学习笔记——泛型