Как реализовать is_stl_vector - PullRequest
4 голосов
/ 18 января 2011

Я хочу специализировать шаблон для аргументов векторного шаблона STL. Примерно так:

// (1)
template <typename T>
class A
{
    ...
};

// (2)
template <>
class A<std::vector<> >
{
    ...
};

Мне все равно, какой тип элемента вектора. Я хотел бы использовать его следующим образом:

A<int> a1; // Will use the general specialization
A<std::vector<int> > a2; // Will use the second specialization

В общем, я пытался определить что-то похожее на черты типа boost. Что-то вроде

template <class T> 
struct is_stl_vector 
{
    // Will be true if T is a vector, false otherwise
    static const bool value = ...; 
};

Я не могу использовать шаблон шаблона (я так думаю), потому что он должен компилироваться и для не шаблонных типов. Это вообще возможно?

Ответы [ 2 ]

7 голосов
/ 18 января 2011

Вы можете просто специализироваться так:

// (2)
template <typename T, typename Alloc>
struct A<std::vector<T, Alloc> >
{...};
6 голосов
/ 18 января 2011

Специализация выглядит так:

// (2)
template <class T, class U>
class A<std::vector<T, U> >
{
    ...
};

Обратите внимание, что он не гарантированно работает (и нет другого способа, который гарантированно будет работать), поскольку количество параметров шаблона std::vector может варьироваться в зависимости от реализации. В C ++ 0x это должно быть решено с помощью пакетов параметров.

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