以下模板功能的含义是什么?

时间:2012-08-16 14:12:57

标签: c++ template-function explicit-instantiation

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

Create_Function(std::string);

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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>>&);

答案 1 :(得分: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”时,我们不会因 odr-use的所有翻译单元中的Function模板实例化而产生费用它,仅在'tmpl.cpp'中,可能会减少编译时间。

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

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