# QVM: Quaternions, Vectors, Matrices

### deduce_scalar

#include <boost/qvm/deduce_scalar.hpp>

    namespace boost
    {
        namespace qvm
        {
            template <class A,class B>
            struct deduce_scalar
            {
                typedef typename impl<A,B>::type type;
            };
        }
    }

#### Assumptions:

A and B satisfy the scalar requirements.

#### Returns:

If A and B are the same type, impl<A,B>::type returns that type. Otherwise, impl<A,B>::type is well defined for the following types only: signed/unsigned char, signed/unsigned short, signed/unsigned int, signed/unsigned long, float and double. The deduction logic is as follows:

- if either of A and B is double, the result is double;
- else, if one of A and B is an integer type and the other is float, the result is float;
- else, if A or B is a signed integer and the other type is unsigned integer, the signed type is changed to unsigned, and then the lesser of the two integers is promoted to the other.

See also: boost/qvm/deduce_scalar.hpp | deduce_mat2 | deduce_quat2 | deduce_vec2 | dot(quat,quat) | dot(vec,vec)