C++ Template 的常见使用方法

非类型模板参数

template<size_t N, typename T>
size_t ArraySize(T (&arr)[N])
{
    return N;
}

inline和constexpr函数模板

template <typename T> inline T min(const T&, const T&);

在一个模板的作用域内,可以直接使用模板名而不必指定模板实参

模板别名

typedef Blob<string> strBlob;
template<typename T> using twin = pair<T,T>;
twin<string> authors; 

C++假定通过作用域运算符访问的是名字不是类型

T::size_type * p // 编译器默认解释为两数相乘
template <typename T>
typename T::value_type top() {return typename T::value_type();} // 使用typename关键词指明当前是类型名

默认模板参数

template <typename T, typename F = less<T>>
int compare(const T &v1, const T &v2, F f = F())
{
    ...
}

成员模板不能是虚函数,但是模板类里可以使用模板参数进行虚函数定义

template<typename T>
class B
{
		virtual T fun1() = 0;  // 合法
		
		template<typename M>
		virtual M fun2() = 0;  // 非法
};

类模板的成员模板

template<typename T>
class B
{
		virtual T fun1() = 0;  // 合法
		
		template<typename M>
		M fun2();  // 非法
};

template<T>
template<M>
M B<T>::fun2()

显示模板实参

template <typename T1, typename T2, typename T3>
T1 sum(T2, T3);

auto ret = sum<long long>(a,b);

尾置返回,使用decltype获取类型降低用户负担,且在使用模板时,由于编译器在遇到参数的参数列表之前,beg的定义不存在,所以必需使用尾置返回

template <typename It>
auto fcn(It beg, It end) -> decltype(*beg)
{
    return *beg;
}

类型转换 P606

template <typename It>
auto fun2(It beg, It end) -> typename remove_reference<decltype(*beg)>::type
{

}

左值引用模板仅能接收左值,右值引用模板可以接收左值和右值,基于引用折叠实现,仅对非成员函数有效,成员函数跟随类模板的实例化,不会由编译器再次推断

template<typename T>
void fun(T&)
{

}

template<typename T>
void fun(T&&)
{

}

为了保证外层参数特性(引用|const),通过将一个函数参数定义为一个指向模板类型参数的右值引用,可以保持其对应实参的所有类型信息

template <typename F, typename T1, typename T2>
void filp(F f, T1 &&t1, T2 &&t2)
{
		f(t2, f1);
}

使用std::forward保持类型信息

template <typename T> inter(T &&arg)
{
		finalFcn(std::forward<T>(arg));
}

可变参数模板

template <typename T, typename... Args>
void foo(const T &t, const Args& ... rest);

sizeof…运算符用于获取包中多少元素

template <typename T, typename... Args>
void foo(const T &tm const Args& ... rest)
{
	sizeof...(rest);
}

模板函数无法进行偏特化,但是可以进行特例化

template<class U> Widget* Create<Widget, U>(const U& arg); // 不允许进行偏特化
template<> Widget* Create(const SomeType& arg);

参考:C++ Primer 5th

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在网络服务等需要提供不间断服务的程序,程序的运行时升级通常都是一项常规任务,例如: 1)运行时修改一些参数配置; 2)运行时修改一个算法模块(动态库); 为了在执行这些任务时,程序不停(仍使用旧配置或旧模块运行),常见的解决方案包括: 1)增加冗余的配置项或模块句柄的存储空间(所有这些数据打包成一个结构体),程序运行时使用的一份;当需要更新时,在更新的过程将新的配置(或模块句柄)内容存储至备用内存;加载完成后将运行时配置(或模块句柄)指针指向新的内存地址。由于修改配置(或模块句柄)的频率远小于这些内容的读取频率,因此一个线程执行更新操作即可。另外,即使外加有多个线程同时读取,由于只涉及到配置项(或模块句柄)的整体结构体的这一个指针修改,读线程读到的值无非是“旧指针”和“新指针”二者之一(如果内存读写模型不支持这一点,或者在这种情况下可能有第三种,甚至第四种情况出现,本方案将不可用),因此程序仍能正常执行,并最终使用更新后的内容运行。 2)程序通过一个主进程协调,具体任务由工作进程完成。外界通知这个主进程使用新的配置(或模块),主进程便创建新的工作进程,这些新启动的进程自然会使用新的配置(或模块);当新创建的进程一切就绪之后,主进程便会通知其他进程结束,并在之后将新的任务委派给新创建的进程。Nginx的设计便是这种方案的一个典型。 这里设计的一个C++模板是上述解决方案1)的一种实现。
C++ Templates第二版》是由David Vandevoorde和Nicolai M. Josuttis合著的一本关于C++模板的书籍。该书是对第一版《C++ Templates》的更新和扩展。C++模板是C++语言一个非常重要的特性,它允许程序员编写泛型代码来处理不同类型的数据。 《C++ Templates第二版》深入讲解了模板的基本概念、语法和用法。书介绍了模板的定义、实现和使用方法,并通过丰富的示例帮助读者理解和掌握模板编程的技巧。此外,书还涵盖了模板元编程、模板特化以及模板的实现细节等高级主题。 与第一版相比,《C++ Templates第二版》在内容和范围上有所扩展。书C++11和C++14的新特性进行了详细的讲解,包括可变参数模板、类型别名模板、constexpr函数等。另外,该书还对模板的一些常见问题和陷阱进行了解释和说明,帮助读者避免在模板编程常见的错误和困惑。 《C++ Templates第二版》着重强调了模板在现代C++编程的重要性和应用。通过学习本书,读者可以深入了解模板的强大功能,提升自己的C++编程水平。无论是初学者还是有一定经验的C++程序员,都可以从受益匪浅。 总之,《C++ Templates第二版》是一本全面而深入的关于C++模板的权威书籍,它涵盖了从基础知识到高级技巧的全部内容,对于想要深入学习和应用C++模板的人来说是一本非常有价值的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值