Как я вынуждаю конкретный экземпляр шаблона C++ инстанцировать?

См. заголовок. У меня есть шаблон. Я хочу вынудить конкретный экземпляр шаблона инстанцировать. Как я делаю это?

Строго говоря, можно ли вынудить абстрактный шаблонный класс инстанцировать?


Я мог бы уточнить, поскольку у меня есть тот же вопрос. В моем случае я создаю библиотеку, некоторые шаблонные реализации являются большими и включают много материала, но только сгенерированы для нескольких типов. Я хочу скомпилировать их в библиотеке и экспортировать все методы, но не включать заголовок с кодом везде.

т.е.:

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.

49
задан peterk 15 October 2011 в 15:29
поделиться

6 ответов

Вы не можете навязывать общие шаблоны для инстанции, компилятор может генерировать только код, если тип полностью известен.

Принудительная атмосфера выполняется путем предоставления всех типов явно:

template class std::vector<int>;

Comeus FAQ [11173] Comeate описаны в некоторых деталях.

56
ответ дан 7 November 2019 в 11:38
поделиться

То, что вы также можете попробовать, - это явное мнение:

template class vector<int>;                    // class
template int& vector<int>::operator[](int);    // member
template int convert<int,double>(double);      // function
46
ответ дан 7 November 2019 в 11:38
поделиться

Абстрактный класс не может быть создан. Вы, вероятно, хотите сделать что-то вдоль линий:

Abstract *a = new Implementation(...);

, чтобы принудительно принудительно создать показатель шаблона, шаблон вызовов с параметрами шаблона:

std::max<int>(...);
std::pair<int, string>(...);
-2
ответ дан 7 November 2019 в 11:38
поделиться

Вы можете принудительно пристраститься с помощью шаблона с нужным параметром. Например, вы можете определить функцию, используя все необходимые методы:

void force_int_instance() {
  Abstract<int> *a;
  a->some_method();
  a->some_other_method(1, 2, 3);
}

Вам не нужно на самом деле на самом деле вызывать эту функцию в любом месте, поэтому это не проблема, которую указатель не инициализируется. Но компилятор должен предположить, что функция может быть вызвана из другого объекта файла, поэтому он должен создать экземпляр шаблона.

1
ответ дан 7 November 2019 в 11:38
поделиться

Если я правильно понимаю ваш вопрос, у вас есть класс шаблона, и вы хотите заставить компилятор генерировать код для использования с некоторым конкретным типом. Например, вы можете гарантировать, что код для STD :: Vector существует в вашей программе.

Лучший способ убедиться, что это просто построить экземпляр класса:

void EnsureInstantiation()
{
    std::vector<int> intvector;
    std::vector<boo> boolvector;
    /// etc.
}

Хитрость заключается в том, что вам даже не нужно вызывать обеспечение для обеспечения гарантии в любом месте вашего кода. Просто убедитесь, что это не статично, ни компилятор май оптимизировать его.

0
ответ дан 7 November 2019 в 11:38
поделиться

Я собираюсь ответить на то, что я думаю, вы имели в виду, а не то, что вы сказали.

Я предполагаю, что проблема является одной из двух вещей. Во-первых, у вас есть код в шаблоне, который не скомпилирован при компиляции сама файла шаблона, который может быть очень раздраженным. Это можно зафиксировать в настройках вашего компилятора.

Другое, что вы хотите иметь что-то особенное для определенного типа, возможно, для ее отладки. Это называется явной инстантством, но на самом деле не значительно указывает, что все просто гарантирует, что он всегда определен после этой точки.

http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/topic/com.ibm.vacpp6m.doc/language/ref/Clrc16xplytit_Instantion.htm

-3
ответ дан 7 November 2019 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: