2010-01-28 119 views
40

查看标题。我有一个模板。我想强制一个模板的特定实例实例化。我该怎么做呢?如何强制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和GCC以及英特尔编译器的几个版本构建库。

+0

你能提供一个例子吗? “实例化抽象模板类”是什么意思? – jalf 2010-01-28 05:06:34

回答

45

你不能强制通用模板实例化,编译器只能生成代码,如果类型是完全已知的。

强制一个实例是通过显式地提供所有类型的完成:

template class std::vector<int>; 

Comeaus template FAQ覆盖在一些细节的相关问题。

+0

请注意,您应该在为所有模板和代码声明为安全之后执行此操作。 – peterk 2011-10-16 14:20:00

+18

@peterk“声明是安全的”让我想了大约20秒。然后,在我宣布之后,我明白了,为了安全起见。“ - 大声笑 – sehe 2012-11-18 02:38:50

+1

这实际上是一个语法错误,至少在gcc 4.1上;它应该是模板类std :: vector '(Alexander的回答下面是正确的) – Redmumba 2013-07-19 18:19:04

-1

抽象类不能instantiated.you可能想要做的线沿线的东西:

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

要强制模板实例,调用模板与模板参数:

std::max<int>(...); 
std::pair<int, string>(...); 
0

如果我正确理解你的问题,你有一个模板类,并要强制编译器生成与一些特定类型使用的代码。例如,您可能希望确保性病代码:: vector的<INT>存在于你的程序。

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

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

的技巧是,你甚至不必在你的代码的任何地方拨打EnsureInstantiation。只要确保它不是静态的,否则编译器可以优化它。

1

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

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

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

-2

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

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

另一种是你想对特定类型有特殊的东西,也许是为了调试它。这就是所谓的显式实例化,但并没有真正实现任何东西,只是确保它始终在那个点之后定义。

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

+0

永远不要试图回答你认为某人的意思。 – Owl 2017-06-29 16:57:49

39

什么你也可以尝试是显式实例:

template class vector<int>;     // class 
template int& vector<int>::operator[](int); // member 
template int convert<int,double>(double);  // function 
+6

直到我到达这篇文章,我试了几天使用模板<>,我无法找出问题是什么。只使用没有尖括号的“模板”就能很好地工作。 – twerdster 2012-06-05 21:56:18

+0

downvoter,关心评论? – 2017-03-02 18:04:50