4

我只想boost::any_cast<T>在类型any没有隐式转换为T. 无论隐式转换如何,如果anyis not的类型,正常行为似乎是抛出异常。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

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

4

2 回答 2

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 不提供。

于 2008-11-25T22:59:56.773 回答
-1

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

于 2015-06-06T06:00:46.250 回答