quat_traits
#include <boost/qvm/quat_traits.hpp>[ORIG_END] -->
namespace
boost
{
    namespace
    qvm
    {
        template <class Q>
        struct quat_traits
        {
            /*main template members unspecified*/
        };
        
        /*
        User-defined (possibly partial) specializations:
        
        template <>
        struct quat_traits<Q>
        {
            typedef /*user-defined*/ scalar_type;        
        
            template <int I> static inline scalar_type read_element( Quaternion const & q );        
            template <int I> static inline scalar_type & write_element( Quaternion & q );        
        };
        */
    }
}
quat_traitsшаблон должен быть специализирован для (определяемых пользователем) типов кватернионов, чтобы обеспечить возможность операций кватернионов, определенных в заголовках Boost QVM для объектов этих типов.
Примечание: типы кватернионов не требуются для копирования.
Главнаяquat_traitsне уточняется. Для определения следующих членов требуются действительные специализации:
- scalar_type: выражениеquat_traits:Scalar_typeдолжен быть типом значения, который удовлетворяет скалярным требованиям..
 
 
Кроме того, действующие специализацииquat_traitsшаблон должен определять по меньшей мере одну из следующих функций доступа в качестве статических членов, гдеqявляется объектом типа Quaternion, аIявляется целочисленной константой времени компиляции:
Примечание:Для кватернионаa + bi + cj + dkэлементы предполагаются в следующем порядке:a,b,c,d; то естьI=0/1/2/3имели бы доступa/b/c/d.
Незаконно называть любую из вышеперечисленных функций, еслине является_quat::value'истинно. Даже тогда кватернионным типам разрешается определять только подмножество функций доступа.
Ниже приведен пример определяемого пользователем типа кватерниона и его соответствующей специализации шаблонаquat_traits: