Продолжая тему, начатую в предыдущем посте, рассмотрим следующее нововведение в стандарте C++09. Итак, встречайте:
Шаблоны с переменным количеством аргументов (Variadic templates (aka "type varargs" for templates) - [N2242], [N2087])
Вы наверное знаете, что существуют функции типа printf, использующие переменное количество аргументов. Естественно, рано или поздно настанет время, когда вам понадобится возможность сделать подобное для шаблона, у которого количество параметров тоже будет переменным. Изначально в новой версии стандарта предполагалось использовать так называемые кортежи (tuples), которые могут быть определены для какого-то фиксированного числа шаблонных аргументов:
// Черновой вариант в C++09 до введения variadic templates
// (некоторые параметры по умолчанию жестко заданы)
//
template<
class T1 = unspecified ,
class T2 = unspecified ,
... ,
class TN = unspecified
> class tuple;
template<class T1, class T2, ..., class TN>
tuple<V1, V2, ..., VN> make_tuple( const T1&, const T2& , ..., const TN& );
Данное объявление выглядит всё более и более зловещим при увеличении N. И что делать, если нам понадобится больше типов, чем содержится в объявлении? К счастью, с появлением variadic templates в C++09 все становится гораздо проще и понятнее:
//
template<class... Types> class tuple;
template<class... Types>
tuple<VTypes...> make_tuple( Types&... );
Данный вариант гораздро проще для определения и работает с любым количеством аргументов. Рассмотрим пример:
// Абсолютно корректный код в C++09
//
template<typename... Mixins>
class X : public Mixins...
{
public:
X( const Mixins&... mixins ) : Mixins(mixins)... { }
};
class A { };
class B { };
class C { };
X<A, B, C> x;
Для типа X<A, B, C> компилятор сгенерирует примерно следующий код:
class X<A, B, C> : public A, public B, public C
{
public:
X( A const& __a, B const& __b, C const& __c ) : A(__a), B(__b), C(__c) { }
};
Продолжение следует...
четверг, 31 мая 2007 г.
С++09 - новый стандарт, новые возможности. Часть 2.
Автор: Ivan на 01:32
Подписаться на:
Комментарии к сообщению (Atom)
2 комментария:
Спасибо большое, за столь полезную пищу для размышлений.
Отправить комментарий