如何强制实例化C++模板的特定实例?

ano*_*non 49 c++ templates instantiation

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

更具体地说,您可以强制抽象模板类进行实例化吗?


我可能会详细说明,因为我有同样的问题.在我的情况下,我正在构建一个库,一些模板实现很大,包含很多东西,但只生成几种类型.我想在库中编译它们并导出所有方法,但不包括带代码的头文件.

即:

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 ...
}
Run Code Online (Sandbox Code Playgroud)

我当然可以引用库中的所有方法来强制它们进行编译和导出,但是不希望向库添加不需要的代码,比如项的参数格式和调用它们的代码等.

????? 具体来说,我正在为多个版本的MSC和GCC以及英特尔编译器构建库.

Geo*_*che 56

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

通过明确提供所有类型来强制实例化:

template class std::vector<int>;
Run Code Online (Sandbox Code Playgroud)

Comeaus 模板FAQ详细介绍了相关问题.

  • @peterk"宣称是安全的"让我想知道大约20秒.然后我突然意识到"在......被宣布之后,_是安全的". - 大声笑 (19认同)
  • 实际上,至少在gcc 4.1上,这实际上是语法错误。它应该是`template class std :: vector &lt;int&gt;`(下面的亚历山大答案是正确的) (2认同)

Ale*_*tov 46

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

template class vector<int>;                    // class
template int& vector<int>::operator[](int);    // member
template int convert<int,double>(double);      // function
Run Code Online (Sandbox Code Playgroud)

  • 直到我到达这篇文章,我试了好几天才使用模板<>,我无法弄清问题是什么.只使用没有角括号的"模板"工作得很好. (7认同)