Я давно задавался этим вопросом, у stackoverflow было множество связанных, но не совсем одинаковых вопросов, поэтому я задаю их здесь.
Возможно ли, чтобы шаблонный класс имел в cpp методы, не зависящие от этого шаблона? Очевидно, что эти методы не зависят от шаблона, поэтому компилятор должен иметь возможность скомпилировать их отдельно.
Если это невозможно, то какой обходной путь, если я действительно хочу В самом деле разделить этот код?
template<typename T>
class MyAwesomeVectorClone{
size_t size;
size_t capacity;
T* data;
bool doesSizeExceedCapacity(); // non template method, define in cpp?
void add(T& t){// template method
}
}
bool MyAwesomeVectorClone::doesSizeExceedCapacity() {
return size > capacity;
}
Не уверен, что вы подразумеваете под compiled separately
, но да, вы можете поместить их в исходный файл, хотя вам все еще нужен параметр шаблона в сигнатуре функции: template <class T> bool MyAwesomeVectorClone<T>::doesSizeExceedCapacity() { return size > capacity; }
@Borgleader Это решение сработает, если нет ничего чище, я буду использовать это
@Mansoor Заметит ли компилятор, что он не использует T, а затем разрешит это? я попробую
@ lennartVH01 lennartVH01 независимо от того, используется ли параметр, не имеет значения, параметр шаблона необходим для правильного определения функции-члена.
Is it possible for a templated class to have methods in the cpp that do not depend on this template?
Нет. Шаблон класса не является конкретным типом, вы создаете тип, которому эти функции-члены могут принадлежать только при создании экземпляра шаблона. Поэтому невозможно обращаться с функциями-членами, которые не зависят от параметра типа шаблона, иначе, чем с остальной частью шаблона класса.
Однако вы можете выделить части, независимые от параметров, в отдельный класс или отдельные бесплатные функции. Это тема статьи 44 книги «Эффективный C++» Скотта Мейерса («Выделение независимого от параметров кода из шаблонов»). Он представляет матричный пример, в котором независимый от параметров код перемещается в базовый класс, от которого в частном порядке наследуется фактический шаблон класса. Но состав, конечно, тоже хорош.
Другим решением является добавление функции и любых других вспомогательных функций в пространство имен, которое ясно указывает, что оно содержит функции, полезные для реализации шаблона класса.
namespace MyAwesomeVectorClone_Impl_Details
{
bool doesSizeExceedCapacity();
}
Эти функции могут быть определены в файле .cpp.
Но вы не можете получить доступ к частному состоянию объекта, делая это
@ lennartVH01, правда. В этом случае вам нужно передать в функцию необходимые параметры.
Поместить не шаблонные части в (не шаблонный) базовый класс и наследовать от него в частном порядке?