Как заставить конкретный экземпляр шаблона c++ создать экземпляр?
посмотреть название. У меня есть шаблон. Я хочу заставить конкретный экземпляр шаблона создать экземпляр. Как мне это сделать?
более конкретно, можете ли вы принудительно создать экземпляр абстрактного класса шаблона?
Я мог бы уточнить, поскольку у меня тот же вопрос. В моем случае я создаю библиотеку, некоторые реализации шаблонов большие и включают в себя много вещей, но генерируются только для нескольких типов. Я хочу собрать их в библиотеке и экспортируйте все методы, но не включайте заголовок с кодом везде.
ie:
template<class T>
OS_EXPORT_DECL class MyTmpl
{
T *item1;
public:
inline T *simpleGetT() { return(item1); } /* small inline code in here */ }
T *doSomeReallyBigMergeStuff(T *b); // note only declaration here
};
// *** implementation source file only seen inside library
template<class T>
MyTmpl<T>::doSomeReallyBigMergeStuff(T *b)
{
... a really big method, but don't want to duplicate it,
so it is a template ...
}
Я мог бы, конечно, ссылаться на все методы внутри библиотеки, которые заставили бы их компилировать и экспортировать, но желание не добавлять ненужный код в библиотеку, как форматирование аргументов для элементов и код для их вызова и т. д.
????? в частности, я создаю библиотеку для нескольких версий компиляторов MSC и GCC и intel.
6 ответов
вы не можете заставить общие шаблоны создавать экземпляры, компилятор может генерировать код только в том случае, если тип полностью известен.
принудительное создание экземпляра выполняется путем явного предоставления всех типов:
template class std::vector<int>;
Comeaus шаблон FAQ охватывает связанные с этим вопросы в некоторых деталях.
то, что вы также можете попробовать, - это явный экземпляр:
template class vector<int>; // class
template int& vector<int>::operator[](int); // member
template int convert<int,double>(double); // function
вы можете принудительно создать экземпляр, используя шаблон с требуемым параметром. Например, вы можете определить функцию, используя все необходимые методы:
void force_int_instance() {
Abstract<int> *a;
a->some_method();
a->some_other_method(1, 2, 3);
}
вам не нужно вызывать эту функцию в любом месте, так что это не проблема, что указатель не инициализирован. Но компилятор должен предположить, что функция может быть вызвана из другого объектного файла, поэтому он должен инстанцировать шаблон.
Если я правильно понимаю ваш вопрос, у вас есть класс шаблона, и вы хотите заставить компилятор генерировать код для использования с определенным типом. Например, вы можете убедиться, что код для std:: vector
лучший способ убедиться в этом-просто построить экземпляр класса:
void EnsureInstantiation()
{
std::vector<int> intvector;
std::vector<boo> boolvector;
/// etc.
}
фокус в том, что вам даже не нужно вызывать EnsureInstantiation в любом месте вашего кода. Просто убедись, что он не статичен. или компилятор мая оптимизировать его.
абстрактный класс не может быть инстанцирован.вы, вероятно, хотите сделать что-то вроде:
Abstract *a = new Implementation(...);
чтобы принудительно создать экземпляр шаблона, вызовите шаблон с параметрами шаблона:
std::max<int>(...);
std::pair<int, string>(...);