Существует несколько концептуальных архетипов:
- Реальная концепция для типов с плавающей точкой.
- Понятие распределения статистических распределений.
<std_real_concept
>является архетипом для реальных типов, включая встроенный поплавок, двойной, длинный двойной.
#include <boost/concepts/std_real_concept.hpp>
namespace boost{
namespace math{
namespace concepts
{
class std_real_concept;
}
}}
Основная цель в предоставлении этого типа заключается в проверке того, что стандартные библиотечные функции обнаруживаются с помощью декларации с использованием - включение этих функций в текущий объем - и не только потому, что они находятся в глобальном масштабе.
Для того, чтобы убедиться, что вызов к слову<pow
>может быть найден либо с помощью поиска, зависящего от аргумента, либо в случае отказа от этого в пространстве имен std: все вызовы стандартных библиотечных функций являются неквалифицированными, а std:: версии, найденные через объявление<using
>, чтобы сделать их видимыми в текущем объеме. К сожалению, легко забыть декларацию<using
>и ошибочно назвать двойную версию функции, которая находится в глобальном масштабе.
Например, если код вызывает::pow, а не std::pow, код будет четко компилироваться, но усечение длинных дублей до удвоения приведет к значительной потере точности. В противоположность этому, шаблон, созданный с помощью std_real_concept, будеттолькокомпилировать, если все стандартные функции библиотеки были введены в существующий объем с помощью декларации использования.
Существует тестовая программа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;
}}}
<real_concept
>является архетипом дляопределяемых пользователем реальных типов, он заявляет о своих стандартных библиотечных функциях в своем собственном пространстве имен: они будут найдены только в том случае, если они называются неквалифицированными, позволяющими зависимому от аргумента поиску найти их. Кроме того, этот тип можно использовать во время выполнения: это позволяет тестировать код, который в противном случае не использовался бы встроенными типами плавающих точек. Для этого типа нет поддержки std::numeric_limits<>, поскольку numeric_limits не является концептуальным требованием дляRealTypes.
NTL RR является примером типа, отвечающего требованиям, предъявляемым к моделям этого типа, но обратите внимание, что требуется использование класса тонкой обертки: обратитесь к«Использование с 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;
}}}
Шаблон класса<distribution_archetype
>является модельюконцепции распределения.
Шаблон класса<DistributionConcept
>представляет собойкласс проверки концепциидля типов распределения.
Программа тестированияdistribution_concept_check.cppотвечает за использование<DistributionConcept
>для проверки того, что все дистрибутивы в этой библиотеке соответствуют концепцииDistribution.
Шаблон класса<DistributionConcept
>проверяет существование (но не надлежащее функционирование) нечленных аксессуаров, требуемых концепцией распределения. Их проверяют по звонкам типа
v = pdf (dist, x); // (результат v игнорируется).
Кроме того, те, кто принимает два аргумента, делают правильные вещи, когда аргументы разных типов (тип результата всегда тот же, что и тип распределения). (Это реализуется некоторыми дополнительными функциями пересылки в derived_accessors.hpp, так что нет необходимости в каких-либо изменениях кода. Аналогичным образом, в них также реализованы шаблонные версии функций опасности/chf/coefficient_of_variation.