C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化相关的知识,希望对你有一定的参考价值。

1. 类模板的部分特例化(partial specialization)

类模板的特例化不必为所有模板参数提供实参(可以只指定一部分而非所有模板参数, 或是参数的一部分而非全部特性)。类模板的部分特例化本身是一个模板, 使用它时用户还必须为那些在特例化版本中未指定的模板参数提供实参。

1.1

//原始的、 最通用的版本 
template <class T> struct remove_reference {
	typedef T type;
};

// 部分特例化版本, 将用于左值引用和右值引用
template <class T> struct remove_reference<T &> // 左值引用 
{  
	typedef T type;
};

template <class T> struct remove_reference<T &&> // 右值引用
{ 
	typedef T type;
};

三个变量 a、 b 和 c 均为 int 类型。

int i;
//decltype(42)为int, 使用原始模板
remove_reference<decltype(42)>::type a;

//decltype (i)为int&, 使用第一个(T&) 部分特例化版本
remove_reference<decltype(i)>::type b;

//decltype(std::move(i))为int &&, 使用第二个即T&&)部分特例化版本
remove_reference<decltype(std::move(i))>::type c;

2. 特例化成员而不是类

可以只特例化特定成员函数而不是特例化整个模板

template <typename T> struct Foo {
	Foo(const T &t = T()):mem(t){ }
	void Bar(){ /*...*/ }
	T mem;
	// Foo 的其他成员
}

//特例化一个模板
template<> void Foo<int>::Bar() //特例化 Foo<int>的成员 Bar
{
    //进行应用于int的特例化处理
}
  
Foo<string> fs;//实例化 Foo<string>::Foo( )
fs.Bar();// 实例化 Foo<string>::Bar( )
Foo<int> fi; //实例化 Foo<int>::Foo( )
fi.Bar();//使用我们特例化版本的 Foo<int>::Bar( )

以上是关于C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化

C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化

C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参