| Home | Libraries | People | FAQ | More

#### Mathematically Undefined Function Policies

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 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> > >());