Вариадические функции (без аргументов!) - PullRequest
5 голосов
/ 23 февраля 2011

Предположим, вы хотите сделать это в C ++ 0x:

size_t count_int() { return 0; }
template<typename T, typename... Tn>
size_t count_int(T a0, Tn... an) {
    size_t n = is_integer<T>::value ? 1 : 0;
    return n + count_int(an...);
}

Хорошо, но нет необходимости передавать аргументы. К сожалению, это не работает:

size_t count_int() { return 0; }
template<typename T, typename... Tn>
size_t count_int() {
    size_t n = is_integer<T>::value ? 1 : 0;
    return n + count_int<Tn...>();
}

GCC жалуется на ошибку: нет соответствующей функции для вызова функции count_int () в строке, следующей за последней. Почему и как это можно исправить? Спасибо.

Ответы [ 3 ]

3 голосов
/ 23 февраля 2011

Это работает :

template <typename T>
size_t count_int()
{
   return is_integer<T>::value ? 1 : 0;
}

template<typename T, typename T1, typename... Tn>
size_t count_int() {
    size_t n = is_integer<T>::value ? 1 : 0;
    return n + count_int<T1,Tn...>();
};
1 голос
/ 23 февраля 2011

Это потому, что условие остановки не является шаблоном функции, поэтому при вызове count_int<Tn...>(); с пустым Tn не шаблонная функция не найдена.

Если вы попытаетесь изменить условие остановки на шаблон:

template <typename...>
size_t count_int() { return 0; }

Вы получите сообщение об ошибке, поскольку неоднозначно, какую функцию вы вызываете, когда у вас do есть параметры в пакете параметров.

Вы можете решить эту проблему путем переадресации вызова в шаблонный класс и вообще избежать рекурсии. Должно работать что-то вроде следующего (хотя мне пока не удалось это сделать)

template <typename T, typename... Tn>
struct int_counter {
    enum { value = is_integer<T>::value + int_counter<Tn...>::value; }
};

template <>
struct int_counter<> {
    enum { value = 0; }
};

template <typename... Tn>
size_t count_int() { 
    return int_counter<Tn>::value;
}
1 голос
/ 23 февраля 2011

Сбой, потому что у вас нет базового случая, когда пакет параметров не содержит значений - так как базовый случай count_int (), который вы использовали ранее, не шаблонизирован и, следовательно, не может быть вызван с <Tn...>, даже когда Tnпустой.Вот почему это не удается.Что касается того, как это можно исправить, я понятия не имею.

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