0

C++での実行時の型識別の使用は何ですか? それがどのように使用され、どのような機能を提供するかは知っていますが、C++ で RTTI を導入した動機は何ですか? RTTIを使用する必要がある小さな例を誰か挙げてもらえますか?

4

3 に答える 3

1

事後条件をチェックするときに使用できます。

class Clonable
{
    virtual Clonable* doClone() const = 0;
public:
    Clonable* clone() const
    {
        Clonable* results = doClone();
        assert( typeid(*results) == typeid(*this) );
        return results;
    }
};

これは、ファクトリ関数のマップへのインデックスとしても使用できます。C++11 では、std::type_indexそれをラップすることができます。以前のバージョンでは、自分で書きました:

std::map<std::type_index, Base* (*)()> factoryMap;

ただし、の出力がstd::type_info::name()指定されていないという事実は、そのユーティリティを必要以上に制限します。

于 2013-09-03T10:45:56.660 に答える
1

以下に例を示します: ポリモーフィック オブジェクトをダウンキャストしたい場合があります (避けるべきですが)。多くの場合、このキャストが毎回有効かどうかはコンパイル時にわかりません。

struct Base { virtual ~Base() {} };
struct A : Base {};
struct B : Base {};

void foo(Base * base)
{
    A * a = dynamic_cast<A *>(base); // RTTI magic here!
    if(a != nullptr)
    {
        // do something with a
    }
}

RTTI はランタイム チェックを犠牲にしてパフォーマンスを低下させることに注意してください。

于 2013-09-03T10:42:09.040 に答える
0

boost::any は良い例です。さまざまなタイプを保持できます (参照: http://www.boost.org/doc/libs/1_54_0/doc/html/any.htmlおよびhttp://wwwのソース コード.boost.org/doc/libs/1_54_0/boost/any.hpp )

于 2013-09-03T10:41:51.347 に答える