Шаблонные классы в <boost/integer/static_min_max.hpp> обеспечивают вычисление минимума и максимума для двух целых чисел при компиляции. Это бывает полезно в задачах обобщенного программирования.
Оглавление
namespace boost
{
template < long Value1, long Value2 >
struct static_signed_min;
template < long Value1, long Value2 >
struct static_signed_max;
template < unsigned long Value1, unsigned long Value2 >
struct static_unsigned_min;
template < unsigned long Value1, unsigned long Value2 >
struct static_unsigned_max;
}
Четыре шаблонных класса дают возможность находить
максимальное и минимальное значения для двух знаковых
или беззнаковых (long)
целых чисел, Value1 и Value2,
на стадии компиляции. Каждый шаблон имеет единственное статическое поле value,
которое получает значение минимума или максимума двух параметров шаблона.
#include <boost/integer/static_min_max.hpp>
template < unsigned long AddendSize1, unsigned long AddendSize2 >
class adder
{
public:
static unsigned long const addend1_size = AddendSize1;
static unsigned long const addend2_size = AddendSize2;
static unsigned long const sum_size = boost::static_unsigned_max<AddendSize1, AddendSize2>::value + 1;
typedef int addend1_type[ addend1_size ];
typedef int addend2_type[ addend2_size ];
typedef int sum_type[ sum_size ];
void operator ()( addend1_type const &a1, addend2_type const &a2, sum_type &s ) const;
};
//...
int main()
{
int const a1[] = { 0, 4, 3 }; // 340
int const a2[] = { 9, 8 }; // 89
int s[ 4 ];
adder<3,2> obj;
obj( a1, a2, s ); // 's' should be 429 or { 9, 2, 4, 0 }
//...
}
Программа static_min_max_test.cpp содержит упрощенную демонстрацию различных операций сравнения с использованием шаблонов для нахождения экстремумов на стадии компиляции.
Иногда наименьшее или наибольшее значение нескольких величин необходимо для дальнейшей обработки во время компиляции, например, для задания параметра другого шаблонного класса.
Автором шаблонов для нахождения экстремумов во время компиляции является Daryle Walker.
Revised October 12, 2001
© Copyright Daryle Walker 2001. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.
Последняя правка: 10.05.2005
библиотека BOOST C++
http://www.boost.org
перевод
Elijah Koziev
www.solarix.ru