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