Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

SFINAE/enable_if

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

QVM: Quaternions, Vectors, Matrices

SFINAE/enable_if

SFINAE расшифровывается как Substitution Failure Is Not An Error. Это относится к ситуации в C++, когда недействительная замена параметров шаблона (в том числе, когда эти параметры выведены неявно в результате неквалифицированного вызова) сама по себе не является ошибкой.

В отсутствие поддержки концепций SFINAE может использоваться для отключения перегрузок шаблонов функций, которые в противном случае представляли бы слишком общую подпись. Формально это поддерживается Boost enable_if library.

Например, Boost QVM определяет перегрузку оператора*, которая работает с любыми типами матриц и векторов, определенными пользователем. Наивным подходом было бы объявить эту перегрузку следующим:

template <class Matrix,class Vector>
Vector operator*( Matrix const & m, Vector const & v );

Даже если определение функции может содержать код, который компилируется только для типов Matrix и Vector, поскольку сама декларация функции действительна, она будет участвовать в перегрузках при умножении объектов любых двух типов вообще. Это обычно делает разрешения перегрузки неоднозначными, и компилятор (правильно) выдает ошибку.

Используя enable_if, Boost QVM объявляет такие перегрузки таким образом, что они сохраняют свою общую подпись, но участвуют только (в разрешениях перегрузки), если принятые параметры имеют смысл в зависимости от семантики определяемой операции:

template <class A,class B>
typename enable_if_c<
    is_mat<A>::value && is_vec<B>::value && mat_traits<A>::cols==vec_traits<B>::dim, //Condition
    B>::type //Return type
operator*( A const & a, B const & b );

Для краткости объявления функций в этой документации определяют условие, которое контролирует, включены ли они или нет, не указывая точно, какая конструкция enable_if используется для достижения этого эффекта.


See also: Accessing Matrix Elements | Accessing Quaternion Elements | Accessing Vector Elements | assign(mat,mat) | assign(quat,quat) | assign(vec,vec) | Boost QVM | boost/qvm/enable_if.hpp | boost/qvm/swizzle.hpp | cmp(mat,mat) | cmp(quat,quat) | cmp(vec,vec) | col | col_mat | conjugate | convert_to(mat) | convert_to(quat) | convert_to(vec) | cross | determinant | diag | diag_mat | dot(quat,quat) | dot(vec,vec) | enable_if | inverse(mat) | inverse(quat) | mag(quat) | mag(vec) | mag_sqr(quat) | mag_sqr(vec) | mat_index_read | mat_index_write | mref | normalize(quat) | normalize(vec) | normalized(quat) | normalized(vec) | operator!=(mat,mat) | operator!=(quat,quat) | operator!=(vec,vec) | operator*(mat,mat) | operator*(mat,scalar) | operator*(mat,vec) | operator*(quat,quat) | operator*(quat,scalar) | operator*(quat,vec) | operator*(vec,mat) | operator*(vec,scalar) | operator*=(mat,mat) | operator*=(mat,scalar) | operator*=(quat,quat) | operator*=(quat,scalar) | operator*=(vec,scalar) | operator+(mat,mat) | operator+(quat,quat) | operator+(vec,vec) | operator+=(mat,mat) | operator+=(quat,quat) | operator+=(vec,vec) | operator-(mat) | operator-(mat,mat) | operator-(quat) | operator-(quat,quat) | operator-(vec) | operator-(vec,vec) | operator-=(mat,mat) | operator-=(quat,quat) | operator-=(vec,vec) | operator/(mat,scalar) | operator/(quat,scalar) | operator/(vec,scalar) | operator/=(mat,scalar) | operator/=(quat,scalar) | operator/=(vec,scalar) | operator==(mat,mat) | operator==(quat,quat) | operator==(vec,vec) | qref | qvm | rot_mat | rot_quat | rotate(mat,vec,scalar) | rotate(quat,vec,scalar) | rotate_x(mat,scalar) | rotate_x(quat,scalar) | rotate_y(mat,scalar) | rotate_y(quat,scalar) | rotate_z(mat,scalar) | rotate_z(quat,scalar) | row | row_mat | scalar_cast(mat) | scalar_cast(quat) | scalar_cast(vec) | set_identity(mat) | set_identity(quat) | set_rot(mat,vec,scalar) | set_rot(quat,vec,scalar) | set_rotx(mat,scalar) | set_rotx(quat,scalar) | set_roty(mat,scalar) | set_roty(quat,scalar) | set_rotz(mat,scalar) | set_rotz(quat,scalar) | set_zero(mat) | set_zero(quat) | set_zero(vec) | sfinae | slerp | transform_point | transform_vector | translation | translation_mat | vec_index_read | vec_index_write | vref

Статья SFINAE/enable_if раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 00:06:33/0.0034759044647217/0