| Home | Libraries | People | FAQ | More

## Getting started

`boost::typeindex::type_info` is a drop-in replacement for `std::type_info` and `boost::typeindex::type_index` is a drop-in replacement for `std::type_index`. Unlike Standard Library versions those classes can work without RTTI.

`type_index` provides the full set of comparison operators, hashing functions and ostream operators, so it can be used with any container class.

### How to use

To start using Boost.TypeIndex:

Replace this: | With the following: | More Info
--- | --- | ---
    #include <typeinfo>
    #include <typeindex>
    #include <boost/type_index.hpp>
| `more...`
    std::type_index
    boost::typeindex::type_index
| `more...`
    typeid(T)
    typeid(T).name() // not human readable
    typeid(variable)
    boost::typeindex::type_id<T>()
    boost::typeindex::type_id<T>().pretty_name() // human readable
    boost::typeindex::type_id_runtime(variable)
| `more...` `more...` `more...`
    // attempt to save const, volatile, reference
    typeid(please_save_modifiers<T>)
    // cvr = const, volatile, reference
    boost::typeindex::type_id_with_cvr<T>()
| `more...`
    // when reference to `std::type_info` is required
    const std::type_info& v1 = typeid(int);

    // other cases
    const std::type_info* v2 = &typeid(int);
    const boost::typeindex::type_info& v1
        = boost::typeindex::type_id<int>().type_info();

    boost::typeindex::type_index v2
        = boost::typeindex::type_id<int>();
| `more...` `more...`

If you are using `type_id_runtime()` methods and RTTI is disabled, make sure that classes that are passed to `type_id_runtime()` are marked with `BOOST_TYPE_INDEX_REGISTER_CLASS` macro.

### Example with Boost.Any

Here is how TypeIndex could be used in `boost/any.hpp`:

Before | With TypeIndex
--- | ---
    #include <typeinfo>
    #include <boost/type_index.hpp>
    virtual const std::type_info & type() const BOOST_NOEXCEPT
    {
        // requires RTTI
        return typeid(ValueType);
    }
    virtual const boost::typeindex::type_info & type() const BOOST_NOEXCEPT
    {
        // now works even with RTTI disabled
        return boost::typeindex::type_id<ValueType>().type_info();
    }

### Example with Boost.Variant

Here is how TypeIndex could be used in `boost/variant/variant.hpp`:

Before | With TypeIndex
--- | ---
    #if !defined(BOOST_NO_TYPEID)
    #include <typeinfo> // for typeid, std::type_info
    #endif // BOOST_NO_TYPEID
    #include <boost/type_index.hpp>
    #if !defined(BOOST_NO_TYPEID)

    class reflect
        : public static_visitor<const std::type_info&>
    {
    public: // visitor interfaces

        template <typename T>
        const std::type_info& operator()(const T&) const BOOST_NOEXCEPT
        {
            return typeid(T);
        }

    };

    #endif // BOOST_NO_TYPEID
    class reflect
        : public static_visitor<const boost::typeindex::type_info&>
    {
    public: // visitor interfaces

        template <typename T>
        const boost::typeindex::type_info& operator()(const T&) const BOOST_NOEXCEPT
        {
            return boost::typeindex::type_id<T>().type_info();
        }

    };
    #if !defined(BOOST_NO_TYPEID)
        const std::type_info& type() const
        {
            detail::variant::reflect visitor;
            return this->apply_visitor(visitor);
        }
    #endif
    const boost::typeindex::type_info& type() const
    {
        detail::variant::reflect visitor;
        return this->apply_visitor(visitor);
    }