0
点赞
收藏
分享

微信扫一扫

[c++11新特性]02-模板优化

七千22 2022-12-06 阅读 115

模板优化

  • ​模板优化​
  • ​​模板别名​​
  • ​​默认模板参数​​
  • ​​外部模板​​

模板别名

在了解类型别名模板之前,需要理解『模板』和『类型』之间的不同。仔细体会这句话:模板是用来产生类型的。在传统 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>;// 强行实例化
extern templateclass std::vector<double>;// 不在当前编译文件中实例化模板

举报

相关推荐

0 条评论