⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 policy_eg_8.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 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 + -