Вот проблема, с которой я столкнулся, играя с вариативными шаблонами. У меня есть код, который использует специализацию для подсчета "интересных" типов в пакете параметров, например:
template<typename... _Pp>
struct count;
template<>
struct count<>
{
static const int value = 0;
};
// ignore uninteresting types
template<typename _First, typename... _Rest>
struct count<_First, _Rest...>
{
static const int value = count<_Rest...>::value;
};
// add 1 for a pointer
template<typename _First, typename... _Rest>
struct count<_First*, _Rest...>
{
static const int value = 1 + count<_Rest...>::value;
};
// add 1 for a reference
template<typename _First, typename... _Rest>
struct count<_First&, _Rest...>
{
static const int value = 1 + count<_Rest...>::value;
};
// add 1 for an int
template<typename... _Rest>
struct count<int, _Rest...>
{
static const int value = 1 + count<_Rest...>::value;
};
Этот код работает нормально, но у меня возникают проблемы, если я хочу использовать тот же подход для подсчета шаблонов классов:
// add 1 for a vector
template<typename... _Rest>
struct count<vector, _Rest...>
{
static const int value = 1 + count<_Rest...>::value;
};
Приведенный выше код не может быть скомпилирован, ошибка - «ожидаемый тип, получил вектор» в строке, начинающейся с «количество структур». Я также не могу сделать что-то более простое, все шаблоны классов принимают один аргумент:
// add 1 for a class template with 1 type parameter
template<template<typename> class _First, typename... _Rest>
struct count<_First, _Rest...>
{
static const int value = 1 + count<_Rest...>::value;
}
Этот код также не может быть скомпилирован из-за жалобы на «ожидаемый тип, снова получил '_First'» в строке, начинающейся с «struct count». Кто-нибудь знаком со способом достижения этой цели с помощью этого подхода (то есть некоторой модификации, которую я могу внести в одну или обе специализации, которые заставят их скомпилировать и выполнить желаемый расчет во время компиляции)?
РЕДАКТИРОВАТЬ: Я хочу, чтобы пакет параметров для вектора был несвязанным, как в следующем коде для простой оболочки контейнера с вариативными параметрами шаблона-шаблона, который также специализируется на std :: vector:
// pass a container as a parameter using variadic template-template
parameter
template<typename _Tp, template<typename...> class _C>
struct success
{
// not specialized for any container
static const bool is_specialized = false;
// data member of container type
_C<_Tp> c_;
};
// partial specialization of above for std::vector
template<typename _Tp>
struct success<_Tp, std::vector>
{
// specialized for vector
static const bool is_specialized = true;
// again, data member of container type
std::vector<_Tp> c_;
};
ИЗМЕНИТЬ Похоже, что окончательный ответ заключается в том, что то, что я хочу сделать, не может быть выполнено, но я нашел способ переосмыслить проблему, чтобы я мог ее решить. Огромное спасибо тем, кто помогал.