53

见标题。我有一个模板。我想强制实例化模板的特定实例。我该怎么做呢?

更具体地说,你能强制一个抽象模板类实例化吗?


我可能会详细说明,因为我有同样的问题。就我而言,我正在构建一个库,一些模板实现很大并且包含很多东西,但只为几种类型生成。我想在库中编译它们并导出所有方法,但不要在任何地方都包含带有代码的标头。

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 编译器构建库。

4

6 回答 6

60

您不能强制泛型模板实例化,编译器只能在类型完全已知的情况下生成代码。

通过显式提供所有类型来强制实例化:

template class std::vector<int>;

Comeaus模板常见问题解答详细介绍了相关问题。

于 2010-01-28T03:11:48.117 回答
58

您还可以尝试显式实例化:

template class vector<int>;                    // class
template int& vector<int>::operator[](int);    // member
template int convert<int,double>(double);      // function
于 2010-01-28T15:50:13.460 回答
1

您可以通过使用带有所需参数的模板来强制实例化。例如,您可以使用所有必需的方法定义一个函数:

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

您不需要在任何地方实际调用该函数,因此指针未初始化不是问题。但是编译器必须假设该函数可能是从另一个目标文件调用的,所以它必须实例化模板。

于 2010-01-28T03:31:08.520 回答
0

如果我正确理解您的问题,那么您有一个模板类,并且您想强制编译器生成用于某些特定类型的代码。例如,您可能希望确保程序中存在 std::vector<int> 的代码。

确保这一点的最好方法是简单地构造一个类的实例:

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

诀窍是您甚至不必在代码中的任何位置调用 EnsureInstantiation。只要确保它不是静态的,否则编译器可能会对其进行优化。

于 2010-01-28T03:27:12.527 回答
-3

抽象类不能被实例化。你可能想要按照以下方式做一些事情:

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

要强制模板实例化,请使用模板参数调用模板:

std::max<int>(...);
std::pair<int, string>(...);
于 2010-01-28T03:10:55.983 回答
-3

我会回答我认为你的意思,而不是你说的。

我猜这个问题是两件事之一。第一个是模板中的代码在编译模板文件本身时没有被编译,这可能非常烦人。这可以在您的编译器设置中修复。

另一个是你想为特定类型提供一些特殊的东西,也许是为了调试它。这称为显式实例化,但并没有真正实例化任何东西,只是确保它始终在该点之后定义。

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

于 2010-01-28T07:09:12.233 回答