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

Use in template code

Boost , Math Toolkit 2.5.0 , Tutorial

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

PrevUpHomeNext

При использовании констант внутри шаблона функций мы должны убедиться, что используем константу правильной точности параметров шаблона. Мы можем сделать это, назвав версии шаблонов функций<pi<FPType>()>констант следующим образом:

#include <boost/math/constants/constants.hpp>
template <class Real>
Real area(Real r)
{
   using namespace boost::math::constants;
   return pi<Real>() * r * r;
}

Хотя этот синтаксис немного менее «милый», чем нешаблонная версия, код не менее эффективен (по крайней мере, для встроенных типов<float>,<double>и<longdouble>): Шаблонные версии констант являются простыми встроенными функциями, которые возвращают константу правильной точности для используемого типа. Кроме того, эти функции объявлены<constexp>для тех компиляторов, которые поддерживают это, позволяя использовать результат в постоянных выражениях при условии, что аргумент шаблона является буквальным типом.

[Tip] Tip

Имейте в виду разницу между вариабельной версией, только<pi>, и версией с функцией шаблона: для функции шаблона требуется как<<floating-point-type>>так и скобки вызова функции<()>, например:<pi<double>()>. Вы не можете писать<doublep =pi<>()>или<double p= pi()>.

[Note] Note

Вы всегда можете использоватькаквариабельную, так и шаблонно-функциональные версиипри условии, что вызовы полностью квалифицированы, например:

double my_pi1 = boost::math::constants::pi<double>();
double my_pi2 = boost::math::double_constants::pi;
[Warning] Warning

Может возникнуть соблазн просто определить

using namespace boost::math::double_constants;
using namespace boost::math::constants;

Но если вы определите два пространства имен, это, конечно, создаст двусмысленность!

double my_pi = pi(); // error C2872: 'pi' : ambiguous symbol
double my_pi2 = pi; // Context does not allow for disambiguation of overloaded function

Хотя ошибка выше довольно очевидна, сделать это случайно или, что еще хуже, создать ее в чужом коде тоже не слишком сложно.

Поэтому разумно избежать этого риска, локализовав область применения таких определений, как показано выше.

[Tip] Tip

Будьте очень осторожны с типом, предоставленным в качестве параметра. Например, предоставление целого числавместо типа с плавающей точкой может быть катастрофическим (функция C++).

cout << "Area = " << area(2) << endl; // Area = 12!!!

Вы должны получить предупреждение компилятора

warning : 'return' : conversion from 'double' to 'int', possible loss of data

Несоблюдение этого предупреждения может привести к очень неправильным ответам!

Вы также можете избежать этого, будучи откровенным о типе<Area>.

cout << "Area = " << area<double>(2) << endl; // Area = 12.566371

PrevUpHomeNext

Статья Use in template code раздела Math Toolkit 2.5.0 Tutorial может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:19:25/0.0067770481109619/0