c++ - boost::any_cast - 仅在隐式转换不可用时抛出?

标签 c++ boost

我要boost::any_cast<T>仅在 any 类型时抛出异常没有隐式转换为 T .如果 any 的类型,正常行为似乎是抛出异常。不是 T ,不考虑隐式转换。

例子:

boost::any a = 1;
boost::any_cast<int>(a); // This succeeds, and rightfully so
boost::any_cast<long>(a); // I don't want this to throw
boost::any_cast<Widget>(a); // I want this to throw

谁能告诉我是否有一种简单的方法来获得我想要的功能,或者更好的是给我一个充分的理由来说明为什么现有的行为是这样的?

最佳答案

好吧,你做不到。 any 机制的工作原理如下:

struct base {
    virtual ~base() { }
};

template<typename T>
struct concrete_base : base {
    T t;
    concrete_base(T t):t(t) { }
};

struct my_any {
    base * b;

    template<typename T>
    my_any(T t):b(new concrete_base<T>(t)) { }

    template<typename T>
    T any_cast() { 
        concrete_base<T> * t = dynamic_cast< concrete_base<T>* >(b);
        if(!t) throw bad_any_cast();
        return t->t;
    }
};

我希望上面的内容很清楚。我认为你不可能做你正在寻找的事情。原因是没有关于保留的类型的信息在这里可以证明是有用的。 RTTI 不提供。

关于c++ - boost::any_cast - 仅在隐式转换不可用时抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/319154/

相关文章:

c++ - boost property_tree 获取值(value)的问题

c++ - 用智能指针替换现有的原始指针

c++ - 使用 boost::bind 传递参数不起作用

c++ - 创建 boost::file_mapping 对象的成本?

c++ - 动态内存分配、指针成员和析构函数

c++ - 在 Visual Studio 代码中添加自定义库

c++ - 使用棋盘标定的相机标定

c++ - 模板冲突类型 - 但类型应该是相同的 cfr 类层次结构?

c++ - 并非所有工作项目都在使用 opencl

c++ - typedef 一个 vector 和固定大小的 boost::numeric::ublas::vector