Шаблонная версия:
explicit quaternion(T const & requested_a = T(), T const & requested_b = T(), T const & requested_c = T(), T const & requested_d = T());
explicit quaternion(::std::complex<T> const & z0, ::std::complex<T> const & z1 = ::std::complex<T>());
template<typename X>
explicit quaternion(quaternion<X> const & a_recopier);
Версия специализации Float:
explicit quaternion(float const & requested_a = 0.0f, float const & requested_b = 0.0f, float const & requested_c = 0.0f, float const & requested_d = 0.0f);
explicit quaternion(::std::complex<float> const & z0,::std::complex<float> const & z1 = ::std::complex<float>());
explicit quaternion(quaternion<double> const & a_recopier);
explicit quaternion(quaternion<long double> const & a_recopier);
Двойная специализация:
explicit quaternion(double const & requested_a = 0.0, double const & requested_b = 0.0, double const & requested_c = 0.0, double const & requested_d = 0.0);
explicit quaternion(::std::complex<double> const & z0, ::std::complex<double> const & z1 = ::std::complex<double>());
explicit quaternion(quaternion<float> const & a_recopier);
explicit quaternion(quaternion<long double> const & a_recopier);
Длинная двойная специализация:
explicit quaternion(long double const & requested_a = 0.0L, long double const & requested_b = 0.0L, long double const & requested_c = 0.0L, long double const & requested_d = 0.0L);
explicit quaternion( ::std::complex<long double> const & z0, ::std::complex<long double> const & z1 = ::std::complex<long double>());
explicit quaternion(quaternion<float> const & a_recopier);
explicit quaternion(quaternion<double> const & a_recopier);
Для каждой формы предусмотрен конструктор по умолчанию, который инициализирует каждый компонент к значениям по умолчанию для их типа (то есть нулю для плавающих чисел). Этот конструктор также может принять от одного до четырех аргументов базового типа. Конструктор также предназначен для построения кватернионов из одного или двух комплексных чисел, имеющих один и тот же базовый тип. Неспециализированный шаблон также имеет шаблонный конструктор копий, в то время как специализированные формы имеют конструкторы копий из двух других специализаций, которые являются явными, когда существует риск потери точности. Для неспециализированной формы конструкторы базового типа не должны бросать.
Деструкторы и конструкторы копий (от одного типа) предоставляются компилятором. Конвертирующие конструкторы копий используют шаблонную функцию помощника в «детальном» подименном пространстве.
T real() const;
quaternion<T> unreal() const;
Как и комплексное число, кватернионы имеют осмысленное понятие «реальной части», но в отличие от них нет осмысленного понятия «воображаемой части». Вместо этого существует «нереальная часть», которая сама по себе является кватернионом, и обычно ничего более простого (в отличие от случая комплексного числа). Их возвращают первые две функции.
T R_component_1() const;
T R_component_2() const;
T R_component_3() const;
T R_component_4() const;
Кватернион, имеющий четыре действительных компонента, возвращается этими четырьмя функциями. Следовательно, реальный и R_компонент_1 возвращают одно и то же значение.
::std::complex<T> C_component_1() const;
::std::complex<T> C_component_2() const;
Кватернион также имеет два сложных компонента, и, как мы видели выше, для любого кватерниона<q = α + βi + γj + δk
>у нас также есть<q = (α + βi) + (γ + δi)j
>. Эти функции возвращают их. Реальная часть<q.C_component_1()
>такая же, как и<q.real()
>.
quaternion<T>& operator = (quaternion<T> const & a_affecter);
template<typename X>
quaternion<T>& operator = (quaternion<X> const& a_affecter);
quaternion<T>& operator = (T const& a_affecter);
quaternion<T>& operator = (::std::complex<T> const& a_affecter);
Они выполняют ожидаемое назначение с модификацией типа, если это необходимо (например, назначение от базового типа установит реальную часть к этому значению, а все другие компоненты к нулю). Для неспециализированной формы операторы назначения базового типа не должны бросать.
quaternion<T>& operator += (T const & rhs)
quaternion<T>& operator += (::std::complex<T> const & rhs);
template<typename X>
quaternion<T>& operator += (quaternion<X> const & rhs);
Они выполняют математическую операцию<(*this)+rhs
>и сохраняют результат в<*this
>. Неспециализированная форма имеет защитные ограждения, которых нет в специализированных формах, чтобы обеспечить безопасность исключения. Для неспециализированной формы операторы назначения базового типа не должны бросать.
quaternion<T>& operator -= (T const & rhs)
quaternion<T>& operator -= (::std::complex<T> const & rhs);
template<typename X>
quaternion<T>& operator -= (quaternion<X> const & rhs);
Они выполняют математическую операцию<(*this)-rhs
>и сохраняют результат в<*this
>. Неспециализированная форма имеет защитные ограждения, которых нет в специализированных формах, чтобы обеспечить безопасность исключения. Для неспециализированной формы операторы назначения базового типа не должны бросать.
quaternion<T>& operator *= (T const & rhs)
quaternion<T>& operator *= (::std::complex<T> const & rhs);
template<typename X>
quaternion<T>& operator *= (quaternion<X> const & rhs);
Они выполняют математическую операцию<(*this)*rhs
>в этом порядке(порядок важен, поскольку умножение не является коммутативным для кватернионов) и сохраняют результат в<*this
>. Неспециализированная форма имеет защитные ограждения, которых нет в специализированных формах, чтобы обеспечить безопасность исключения. Для неспециализированной формы операторы назначения базового типа не должны бросать.
quaternion<T>& operator /= (T const & rhs)
quaternion<T>& operator /= (::std::complex<T> const & rhs);
template<typename X>
quaternion<T>& operator /= (quaternion<X> const & rhs);
Они выполняют математическую операцию<(*this)*inverse_of(rhs)
>в этом порядке(порядок важен, поскольку умножение не является коммутативным для кватернионов) и сохраняют результат в<*this
>. Неспециализированная форма имеет защитные ограждения, которых нет в специализированных формах, чтобы обеспечить безопасность исключения. Для неспециализированной формы операторы назначения базового типа не должны бросать.