Зная количество параметров шаблона в объявлении - PullRequest
3 голосов
/ 18 июля 2011

Если у меня есть,

template<typename T1, typename T2, int N>
class X {};

Есть ли способ узнать, что у class X есть 3 template аргументов?

Краткое описание варианта использования : существует два библиотечных класса ptr<T> (для обычного указателя) и ptr_arr<T,N> (для указателя на массив). Эти два взаимодействуют с другим классом следующим образом:

template<typename T>
void Clear(const T &obj)
{
  if(T::Args == 1) destroy(obj);
  else destroy_arr(obj);
}

Итак, я подумал, что если у нас будет какой-нибудь удобный способ узнать количество параметров, это будет легко. Однако я узнаю, что мне нужно изменить свою бизнес-логику, поскольку такого не может быть.

Ответы [ 3 ]

6 голосов
/ 18 июля 2011

Не существует стандартного способа сделать это (если вы не используете variadic sizeof(Args...) в C ++ 0x), но это не относится к делу - вопрос неправильный.

Использовать разрешение перегрузки.

template <typename T>
void clear (ptr<T> & obj) {
    destroy (obj);
}

template <typename T, int N>
void clear (ptr_arr<T,N> & obj) {
    destroy_arr (obj);
}
5 голосов
/ 18 июля 2011

Вы можете использовать mpl::template_arity (без документов)

http://www.boost.org/doc/libs/1_40_0/boost/mpl/aux_/template_arity.hpp

0 голосов
/ 19 июля 2011

Нет способа сделать это. Представьте себе количество перегрузок.

template<int> struct A;
template<bool> struct B;
template<char> struct C;
template<typename> struct D;
template<D<int>*> struct E;
template<D<bool>*> struct F;
template<typename, int> struct G;
// ...

Для каждого из них вам потребуется отдельный шаблон для их принятия. Вы даже не можете использовать шаблоны переменных C ++ 0x, потому что пакеты параметров шаблона работают только с одной формой и типом параметра (например, int... работает только для пакета параметров, полного целых чисел).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...