模板优化
- 模板优化
- 模板别名
- 默认模板参数
- 外部模板
模板别名
在了解类型别名模板之前,需要理解『模板』和『类型』之间的不同。仔细体会这句话:模板是用来产生类型的。在传统 C++ 中,typedef 可以为类型定义一个新的名称,但是却没有办法为模板定义一个新的名称。因为,模板不是类型。例如:
template<typename T,typename U>
class MagicType{
public:
T dark;
U magic;
};
// 不合法
template<typename T>
typedef MagicType<std::vector<T>, std::string> FakeDarkMagic;
C++11 使用 using 引入了下面这种形式的写法,并且同时支持对传统 typedef 相同的功效:
通常我们使用 typedef 定义别名的语法是:typedef 原名称 新名称;,但是对函数指针等别名的定义语法却不相同,这通常给直接阅读造成了一定程度的困难。
typedef int(*process)(void*);
using NewProcess=int(*)(void*);
template<typename T>
using TrueDarkMagic = MagicType<std::vector<T>, std::string>;
int main()
{
TrueDarkMagic<bool> you;
}
默认模板参数
我们定义了一个加法函数:
template<typename T,typename U>
auto add(T x, U y)->decltype(x+y)
{
return x+y;
}
但在使用时发现,要使用 add,就必须每次都指定其模板参数的类型。在 C++11 中提供了一种便利,可以指定模板的默认参数:
template<typename T =int,typename U =int>
auto add(T x, U y)->decltype(x+y)
{
return x+y;
}
外部模板
传统 C++ 中,模板只有在使用时才会被编译器实例化。换句话说,只要在每个编译单元(文件)中编译的代码中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且,我们没有办法通知编译器不要触发模板的实例化。
为此,C++11 引入了外部模板,扩充了原来的强制编译器在特定位置实例化模板的语法,使我们能够显式的通知编译器何时进行模板的实例化:
template class std::vector<bool>;// 强行实例化标签:11,02,typedef,c++,编译器,实例,C++,模板 From: https://blog.51cto.com/u_6650004/5916376
extern templateclass std::vector<double>;// 不在当前编译文件中实例化模板