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

Setting Polices at Namespace Scope

Boost , Math Toolkit 2.5.0 , Policy Reference

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

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

BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(Policy)

и:

BOOST_MATH_DECLARE_DISTRIBUTIONS(Type, Policy)

Вы можете использовать любой из этих макросов после включения любой специальной функции или заголовка распределения. Например:

#include <boost/math/special_functions/gamma.hpp>
//using boost::math::tgamma;
// Need not declare using boost::math::tgamma here,
// because will define tgamma in myspace using macro below.
namespace myspace
{
  using namespace boost::math::policies;
  // Define a policy that does not throw on overflow:
  typedef policy<overflow_error<errno_on_error> > my_policy;
  // Define the special functions in this scope to use the policy:   
  BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(my_policy)
}
// Now we can use myspace::tgamma etc.
// They will automatically use "my_policy":
//
double t = myspace::tgamma(30.0); // Will *not* throw on overflow,
// despite the large value of factorial 30 = 265252859812191058636308480000000
// unlike default policy boost::math::tgamma;

В этом примере с помощью BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS В результате определяется набор тонких встроенных функций пересылки:

template <class T>
inline T tgamma(T a){ return ::boost::math::tgamma(a, mypolicy()); }
template <class T>
inline T lgamma(T a) ( return ::boost::math::lgamma(a, mypolicy()); }

и так далее. Обратите внимание, что в то время как функция пересылки определена для всех специальных функций, однако, если вы не включаете конкретный заголовок для специальной функции, которую вы используете (или boost/math/special_functions.hpp, чтобы включить все), вы получите ошибки линкера из функций, которые объявлены вперед, но не определены.

Мы можем сделать то же самое с распределениями, но на этот раз нам нужно указать тип плавающей точки для использования:

#include <boost/math/distributions/cauchy.hpp>
namespace myspace
{ // using namespace boost::math::policies; // May be convenient in myspace.
  // Define a policy called my_policy to use.
  using boost::math::policies::policy;
// In this case we want all the distribution accessor functions to compile,
// even if they are mathematically undefined, so
// make the policy assert_undefined.
  using boost::math::policies::assert_undefined;
typedef policy<assert_undefined<false> > my_policy;
// Finally apply this policy to type double.
BOOST_MATH_DECLARE_DISTRIBUTIONS(double, my_policy)
} // namespace myspace
// Now we can use myspace::cauchy etc, which will use policy
// myspace::mypolicy:
//
// This compiles but throws a domain error exception at runtime.
// Caution! If you omit the try'n'catch blocks, 
// it will just silently terminate, giving no clues as to why! 
// So try'n'catch blocks are very strongly recommended.
void test_cauchy()
{
   try
   {
      double d = mean(myspace::cauchy());  // Cauchy does not have a mean!
   }
   catch(const std::domain_error& e)
   {
      cout << e.what() << endl;
   }
}

В этом примере результат BOOST_MATH_DECLARE_DISTRIBUTIONS Объявлять типдеф для каждого распределения таким образом:

typedef boost::math::cauchy_distribution<double, my_policy> cauchy;
tyepdef boost::math::gamma_distribution<double, my_policy> gamma;

и так далее. Имя, данное каждому типдефу, является именем дистрибутива с удаленным суффиксом «_distribution».


PrevUpHomeNext

Статья Setting Polices at Namespace Scope раздела Math Toolkit 2.5.0 Policy Reference может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Policy Reference ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 23:14:24/0.0084710121154785/1