...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
There are some functions that are generic (they are present for all the statistical distributions supported) but which may be mathematically undefined for certain distributions, but defined for others.
For example, the Cauchy distribution does not have a meaningful mean, so what should
mean(cauchy<>());
return, and should such an expression even compile at all?
The default behaviour is for all such functions to not compile at all - in fact they will raise a static assertion - but by changing the policy we can have them return the result of a domain error instead (which may well throw an exception, depending on the error handling policy).
This behaviour is controlled by the assert_undefined<>
policy:
namespace boost{ namespace math{ namespace policies { template <bool b> class assert_undefined; }}} //namespaces
For example:
#include <boost/math/distributions/cauchy.hpp> using namespace boost::math::policies; using namespace boost::math; // This will not compile, cauchy has no mean! double m1 = mean(cauchy()); // This will compile, but raises a domain error! double m2 = mean(cauchy_distribution<double, policy<assert_undefined<false> > >());
policy<assert_undefined<false>
behaviour can also be obtained by defining the macro
#define BOOST_MATH_ASSERT_UNDEFINED_POLICY false
at the head of the file - see Using Macros to Change the Policy Defaults.