![]() |
Home | Libraries | People | FAQ | More |
這裡有一些概率典型例子:
#include <boost/concepts/std_real_concept.hpp>
namespace boost{ namespace math{ namespace concepts{ class std_real_concept; }}} // namespaces
std_real_concept 是一個針對於內建(build-in)實數的典型例子。
提供這個類型的主要目的是證實通過一個using 聲明可以找到標準庫函數-將這些函數引入當前的作用域中-而不僅僅是因為它們偶然出現在全局作用域中。
為了確保對一個函數的調用可以通過參數依賴性查找(argument dependent lookup)找到或是在名字空間std中找到:所有對標準庫函數的調用都是不加前綴修飾的,除非使用 std:: 修飾來使用一個using 聲明使得它們在當前的作用域中可見。不幸的是,很容易忘記這個using 聲明,而錯誤地調用在全局名字空間中的double版本的函數。
例如,如果代碼調用 ::pow 而不是 std::pow,那麼代碼可以很好地編譯,但是從long double到double的截斷將會產生很嚴重的精度損失。反過來,一個使用std_real_concept實例化的模板僅在所有的標準庫函數通過一個using 聲明而引入到當前的作用域中時才會編譯。
有一個測試程序libs/math/test/std_real_concept_check.cpp 使用std_real_concept來實例化這個庫中的所有的模板來驗證對於標準庫函數的使用。
#include <boost/math/concepts/real_concept.hpp>
namespace boost{ namespace math{ namespace concepts{ class real_concept; }}} // namespaces
real_concept 是一個用戶定義的實數類型(user defined real types)的原型( archetype
),它在自己的名字空間中聲明標準庫函數:如果它們被不加前綴修飾(unqualified)調用,進行參數依賴性查找(argument dependent
lookup)來定位這些函數時才會找到這些函數。除此之外,這種類型可以在運行時使用:這使得沒有被內建的浮點類型檢測的的代碼可以被測試。這個類型沒有std::numeric_limits<> 支持,因為這不是RealType的一個概念性的要求。
NTL RR是一個滿足這個類型要求的例子,但是注意,需要一個對NTL RR的包裝類(wrapper class):參考"與NTL一起使用 - 一個高精度的浮點庫 "。
沒有對real_concept的特別的測試用例,
因為這個類型在運行時是可用的,每個單獨的測試也測試float, double 和 long
double, 以及 real_concept.
#include <boost/math/concepts/distribution.hpp>
namespace boost{ namespace math{ namespace concepts{ template <class RealType> class distribution_archetype; template <class Distribution> struct DistributionConcept; }}} // namespaces
類模板distribution_archetype
是統計分佈概念(Distribution
concept)的一個模型。
類模板DistributionConcept
是一個針對於分佈類型的概念檢查類(concept checking
class) 。
測試程序distribution_concept_check.cpp
負責使用DistributionConcept
來確保這個庫中的所有的分佈類型滿足分佈概念(Distribution concept)。
類模板DistributionConcept
驗證 (但不是 proper function) 分佈概念(Distribution
concept) 所要求的非成員訪問函數:通過類似於下面的調用來檢查:
v = pdf(dist, x); // (結果 v 被忽略)。
除此之外,當參數是不同類型的時候,這些函數接受兩個參數來正常工作(RealType總是與分佈的value_type類型一樣)。(這通過在derived_accessors.hpp中的一些額外的前向函數(forwarding-function)來實現的,使得不需要對代碼進行任何的修改。類似地, boilerplate版本的 hazard/chf/coefficient_of_variation 也在這裡實現)。