См. заголовок. У меня есть шаблон. Я хочу вынудить конкретный экземпляр шаблона инстанцировать. Как я делаю это?
Строго говоря, можно ли вынудить абстрактный шаблонный класс инстанцировать?
Я мог бы уточнить, поскольку у меня есть тот же вопрос. В моем случае я создаю библиотеку, некоторые шаблонные реализации являются большими и включают много материала, но только сгенерированы для нескольких типов. Я хочу скомпилировать их в библиотеке и экспортировать все методы, но не включать заголовок с кодом везде.
т.е.:
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 и компиляторов Intel и GCC.
Вы не можете навязывать общие шаблоны для инстанции, компилятор может генерировать только код, если тип полностью известен.
Принудительная атмосфера выполняется путем предоставления всех типов явно:
template class std::vector<int>;
Comeus FAQ [11173] Comeate описаны в некоторых деталях.
То, что вы также можете попробовать, - это явное мнение:
template class vector<int>; // class
template int& vector<int>::operator[](int); // member
template int convert<int,double>(double); // function
Абстрактный класс не может быть создан. Вы, вероятно, хотите сделать что-то вдоль линий:
Abstract *a = new Implementation(...);
, чтобы принудительно принудительно создать показатель шаблона, шаблон вызовов с параметрами шаблона:
std::max<int>(...);
std::pair<int, string>(...);
Вы можете принудительно пристраститься с помощью шаблона с нужным параметром. Например, вы можете определить функцию, используя все необходимые методы:
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.
}
Хитрость заключается в том, что вам даже не нужно вызывать обеспечение для обеспечения гарантии в любом месте вашего кода. Просто убедитесь, что это не статично, ни компилятор май оптимизировать его.
Я собираюсь ответить на то, что я думаю, вы имели в виду, а не то, что вы сказали.
Я предполагаю, что проблема является одной из двух вещей. Во-первых, у вас есть код в шаблоне, который не скомпилирован при компиляции сама файла шаблона, который может быть очень раздраженным. Это можно зафиксировать в настройках вашего компилятора.
Другое, что вы хотите иметь что-то особенное для определенного типа, возможно, для ее отладки. Это называется явной инстантством, но на самом деле не значительно указывает, что все просто гарантирует, что он всегда определен после этой точки.