4

の型にへの暗黙的な変換がないboost::any_cast<T>場合にのみ、例外をスローしたいと考えています。通常の動作は、暗黙的な変換に関係なく、型がis notの場合に例外をスローするようです。anyTanyT

例:

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 はそれを行うことはできませんが、基本型と派生型が完全である場合 (通常は階層内にある型の場合)、派生型へのポインターをスローするため、スローとキャッチによって変換する独自のシステムを実装できます。型は、基本ポインター型としてキャッチできます。

于 2015-06-06T06:00:46.250 に答える