📄 policy_eg_8.cpp
字号:
// Copyright John Maddock 2007.// Copyright Paul a. Bristow 2007// Use, modification and distribution are subject to the// Boost Software License, Version 1.0. (See accompanying file// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)// Note that this file contains quickbook mark-up as well as code// and comments, don't change any of the special comment mark-ups!#ifdef _MSC_VER# pragma warning (disable : 4100) // 'unreferenced formal parameter#endif#include <iostream>//[policy_eg_8/*`Suppose we want our own user-defined error handlers rather than theany of the default ones supplied by the library to be used. Ifwe set the policy for a specific type of error to `user_error`then the library will call a user-supplied error handler.These are forward declared, but not defined inboost/math/policies/error_handling.hpp like this: namespace boost{ namespace math{ namespace policies{ template <class T> T user_domain_error(const char* function, const char* message, const T& val); template <class T> T user_pole_error(const char* function, const char* message, const T& val); template <class T> T user_overflow_error(const char* function, const char* message, const T& val); template <class T> T user_underflow_error(const char* function, const char* message, const T& val); template <class T> T user_denorm_error(const char* function, const char* message, const T& val); template <class T> T user_evaluation_error(const char* function, const char* message, const T& val); template <class T> T user_indeterminate_result_error(const char* function, const char* message, const T& val); }}} // namespacesSo out first job is to include the header we want to use, and thenprovide definitions for the user-defined error handlers we want to use:*/#include <iostream>#include <boost/math/special_functions.hpp>namespace boost{ namespace math{ namespace policies{template <class T>T user_domain_error(const char* function, const char* message, const T& val){ std::cerr << "Domain Error." << std::endl; return std::numeric_limits<T>::quiet_NaN();}template <class T>T user_pole_error(const char* function, const char* message, const T& val){ std::cerr << "Pole Error." << std::endl; return std::numeric_limits<T>::quiet_NaN();}}}} // namespaces/*`Now we'll need to define a suitable policy that will call these handlers,and define some forwarding functions that make use of the policy:*/namespace{using namespace boost::math::policies;typedef policy< domain_error<user_error>, pole_error<user_error>> user_error_policy;BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(user_error_policy)} // close unnamed namespace/*`We now have a set of forwarding functions defined in an unnamed namespacethat all look something like this:``template <class RealType>inline typename boost::math::tools::promote_args<RT>::type tgamma(RT z){ return boost::math::tgamma(z, user_error_policy());}``So that when we call `tgamma(z)` we really end up calling`boost::math::tgamma(z, user_error_policy())`, and anyerrors will get directed to our own error handlers:*/int main(){ std::cout << "Result of erf_inv(-10) is: " << erf_inv(-10) << std::endl; std::cout << "Result of tgamma(-10) is: " << tgamma(-10) << std::endl;}/*`Which outputs:[preDomain Error.Result of erf_inv(-10) is: 1.#QNANPole Error.Result of tgamma(-10) is: 1.#QNAN]*///]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -