我如何强制C ++模板的特定实例实例化?
看标题。 我有一个模板。 我想强制一个模板的特定实例来实例化。 我该怎么做呢?
更具体地说,你可以强制抽象模板类来实例化吗?
我可以详细说明,因为我有同样的问题。 在我的情况下,我正在build立一个库,一些模板实现很大,包括很多的东西,但只生成几个types。 我想在库中编译它们,并导出所有的方法,但不包含任何地方的代docker。
即:
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以及英特尔编译器的几个版本构build库。
您不能强制通用模板实例化,编译器只能在types完全知道的情况下生成代码。
通过显式提供所有types来强制实例化:
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); }
你不需要在任何地方实际调用这个函数,所以指针没有被初始化并不是一个问题。 但编译器必须假设该函数可能被另一个对象文件调用,所以它必须实例化模板。
如果我正确理解你的问题,你有一个模板类,你想强制编译器生成的代码使用某种特定的types。 例如,您可能希望确保程序中存在std :: vector <int>的代码。
确保这个最好的方法是简单地构造一个类的实例:
void EnsureInstantiation() { std::vector<int> intvector; std::vector<boo> boolvector; /// etc. }
诀窍是,您甚至不必在代码中的任何地方调用EnsureInstantiation。 只要确保它不是静态的,否则编译器可能会优化它。
抽象类不能实例化,你可能想要做一些事情:
Abstract *a = new Implementation(...);
要强制模板实例化,请使用模板参数调用模板:
std::max<int>(...); std::pair<int, string>(...);
我要回答我认为你的意思,而不是你所说的。
我猜这个问题是两件事情之一。 第一个问题是,当你编译模板文件时,你的模板中没有编译代码,这可能是非常烦人的。 这可以在你的编译器设置中修复。
另一种是你想为特定的types提供一些特殊的东西,也许是为了debugging它。 这就是所谓的显式实例,但是并没有真正实现任何东西,只是确保在那之后定义它。