Как заставить конкретный экземпляр шаблона 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>(...);