Иногда то, что вы действительно хотите сделать, это ввести все специальные функции или все дистрибутивы в определенную область имен, а также конкретную политику использования с ними. Для содействия этому определены два макроса:
BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(Policy)
и:
BOOST_MATH_DECLARE_DISTRIBUTIONS(Type, Policy)
Вы можете использовать любой из этих макросов после включения любой специальной функции или заголовка распределения. Например:
#include <boost/math/special_functions/gamma.hpp>
namespace myspace
{
using namespace boost::math::policies;
typedef policy<overflow_error<errno_on_error> > my_policy;
BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(my_policy)
}
double t = myspace::tgamma(30.0);
В этом примере с помощью 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 boost::math::policies::policy;
using boost::math::policies::assert_undefined;
typedef policy<assert_undefined<false> > my_policy;
BOOST_MATH_DECLARE_DISTRIBUTIONS(double, my_policy)
}
void test_cauchy()
{
try
{
double d = mean(myspace::cauchy());
}
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».