Специализировать шаблон шаблоном
Есть некий класс шаблонный контейнер, хочу сделать чтобы он поддерживал 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 шт):
Ну, прямого решения не вижу, но вот такой обходной маневр - связанный с тем, что 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();
}