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

时间:2008-11-25 22:42:32

标签: 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

有人能告诉我是否有一种简单的方法来获得我想要的功能,或者更好地为我提供一个充分的理由来解释现有行为的原因是什么?

2 个答案:

答案 0 :(得分:5)

嗯,你不能这样做。 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不提供它。

答案 1 :(得分:-1)

any_cast不能这样做但是如果基类和派生类型是完整的(它们通常用于层次结构中的类型)你可以实现自己的系统,它通过throw和catch转换,因为抛出指针到派生类型可以作为基指针类型捕获。