4
#define Create_Function(Type) \
    template void Function( std::vector<boost::shared_ptr<Type>>&)

Create_Function(std::string);

我在遗留代码中看到了上面的代码,但不知道它的含义。它既不是常规的非特化函数定义,也不是完整的特化函数定义。

任何想法?

4

2 回答 2

4

它执行显式模板实例化(请参阅MSDN

显式实例化允许您创建模板类或函数的实例化,而无需在代码中实际使用它。因为这在您创建使用模板进行分发的库 (.lib) 文件时很有用,所以未实例化的模板定义不会放入对象 (.obj) 文件中。

给定一个通用函数模板

template<typename T>
void Function( std::vector<boost::shared_ptr<T>>&)
{
    // bla bla
}

对宏的调用Create_Function(std::string);将扩展为

template void Function( std::vector<boost::shared_ptr<std::string>>&);
于 2012-08-16T14:13:43.593 回答
3

那是函数模板的显式实例化。给定一个模板,如:

template <typename T>
void Function( std::vector<boost::shared_ptr<T> >& );

(可能在标头中声明并在 .cpp 文件中定义),代码:

template void Function( std::vector<boost::shared_ptr<int> >& );

要求编译器实例化此翻译单元中的特化(为其生成代码)。这可以用来减少编译时间,因为模板的用户只需要查看模板的声明,并且不会在使用它的每个翻译单元中实例化它。不利的一面是,它要求对于与该模板一起使用的每种类型,显式实例化都在可以访问模板定义的翻译单元中执行,这将模板的使用限制为这些实例化。

// tmpl.h
template <typename T>
void Function( std::vector<boost::shared_ptr<T> >& );

// tmpl.cpp
template <typename T>
void Function( std::vector<boost::shared_ptr<T> >& p ) {
    ... 
}
template void Function( std::vector<boost::shared_ptr<int> >& );
template void Function( std::vector<boost::shared_ptr<double> >& );

// user.cpp, user2.cpp, user3.cpp
#include <tmpl.h>
...
    std::vector<boost::shared_ptr<int> > v;
    Function( v );                             // [1]

在这个例子中,当编译“user#.cpp”时,我们不会在所有使用它的翻译单元中产生Function模板实例化的成本,只有在“tmpl.cpp”中,这可能会减少编译时间。

有时不利的一面实际上是这种方法的原因,因为您可以有效地将实例化类型限制为您为其提供了显式实例化的子集(即在上面的代码中,如果“userN.cpp”试图调用Function传递向量指向链接器的共享指针std::string会抱怨)。

最后,在少数情况下,当可使用的类型集有限,我将其视为对库用户隐藏模板的实际实现的一种方式。

于 2012-08-16T14:23:59.380 回答