Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

概念上的典型例子和測試(Conceptual Archetypes and Testing)

這裡有一些概率典型例子:

#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, doublelong 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 也在這裡實現)。


PrevUpHomeNext