mirror of
https://github.com/boostorg/type_index.git
synced 2026-01-19 16:52:13 +00:00
48 lines
1.4 KiB
C++
48 lines
1.4 KiB
C++
// Copyright 2013-2014 Antony Polukhin
|
|
|
|
// Distributed under the Boost Software License, Version 1.0.
|
|
// (See the accompanying file LICENSE_1_0.txt
|
|
// or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
|
|
|
|
//[type_index_derived_example
|
|
/*`
|
|
The following example shows that `type_info` is able to store the real type, successfully getting through
|
|
all the inheritances.
|
|
|
|
Example works with and without RTTI."
|
|
*/
|
|
|
|
#include <boost/type_index.hpp>
|
|
#include <boost/type_index/runtime_cast/register_runtime_class.hpp>
|
|
#include <iostream>
|
|
|
|
struct A {
|
|
BOOST_TYPE_INDEX_REGISTER_CLASS
|
|
virtual ~A(){}
|
|
};
|
|
struct B: public A { BOOST_TYPE_INDEX_REGISTER_CLASS };
|
|
struct C: public B { BOOST_TYPE_INDEX_REGISTER_CLASS };
|
|
struct D: public C { BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_TYPE_INDEX_NO_BASE_CLASS) };
|
|
|
|
void print_real_type(const A& a) {
|
|
std::cout << boost::typeindex::type_id_runtime(a).pretty_name() << '\n';
|
|
}
|
|
|
|
int main() {
|
|
C c;
|
|
const A& c_as_a = c;
|
|
print_real_type(c_as_a); // Outputs `struct C`
|
|
print_real_type(B()); // Outputs `struct B`
|
|
|
|
/*`
|
|
It's also possible to use type_id_runtime with the BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS, which adds additional
|
|
information for runtime_cast to work.
|
|
*/
|
|
D d;
|
|
const A& d_as_a = d;
|
|
print_real_type(d_as_a); // Outputs `struct D`
|
|
|
|
}
|
|
|
|
//] [/type_index_derived_example]
|