Специализировать шаблон шаблоном

Есть некий класс шаблонный контейнер, хочу сделать чтобы он поддерживал std::unique_ptr в качестве содержимого, но реализацию некоторых методов нужно изменить (сделать move вместо копирования), так вот, можно ли как-то специализировать эти методы для всех std::unique_ptr?

Пытался сделать так template<class T> void Container<std::unique_ptr<T> >::linearise() - компилятор ругается.

Не понимаю, как следующая информация относится к вопросу, но добавил по просьбе комментаторов.

Вот так работаю с теми что принимают T:

void push_back(T const & elem) {
  if (m_size == m_capacity)
    throw std::overflow_error("Pushing to full container");
    m_body[realPlace(m_size)] = elem;
    ++m_size;
}

void push_back(T && elem) {
  if (m_size == m_capacity)
    throw std::overflow_error("Pushing to full container");
  m_body[realPlace(m_size)] = std::move(elem);
  ++m_size;
}

Вот пример метода который не принимает аргумментов, но требует информации о содержимом:

 T* linearize() {
   if (is_linear())
     return m_body;
   byte *oldMemPool = m_memPool;
   T *oldBody = m_body;
   alloc_body(m_capacity);
   for (size_t i = 0; i < m_size; ++i)
     m_body[i] = oldBody[realPlace(i)];
   m_begin = 0;
   delete[] oldMemPool;
   return m_body;
}

Ответы (1 шт):

Автор решения: Harry

Ну, прямого решения не вижу, но вот такой обходной маневр - связанный с тем, что unique_ptr можно перемещать, но не копировать.

Я привожу свой простой пример, думаю, для себя вы разберетесь, как применить:

template<typename T>
struct C {
    void doit();
};

template<typename T>
void C<T>::doit()
{
    if constexpr (!is_copy_constructible_v<T> && is_move_constructible_v<T>)
        cout << "doit<UPT>\n";
    else
        cout << "doit<T>\n";
};


int main(int argc, const char * argv[])
{
    C<int> a;
    C<unique_ptr<int>> b;

    a.doit();
    b.doit();
}
→ Ссылка