两种通式:函数模板通式,类模板通式
一、函数模板通式
template <class 形参名,class 形参名,...> 返回类型 函数名(参数列表)
{
... //函数体
}
二、类模板通式
template<class 形参名,class 形参名,…> class 类名{
...//类定义
};
三种类型的模板形参:类型形参,非类型形参和模板形参。
一、类型形参
二、非类型形参
1.模板的非类型形参只能是整型,指针和引用。可转化为整形的类型都可以作为形参,比如int,char,long,unsigned,bool,short(enum声明的内部数据可以作为实参传递给int,但是一般不能当形参),参考image1.png
2.非类型形参在模板定义的内部是常量值,必须能在编译时计算出结果
3.非类型形参一般不应用于函数模板中
用法一:https://stackoverflow.com/questions/23711389/template-with-bool-parameter
用法二:
template<bool B> class KaldiCompileTimeAssert { };
template<> class KaldiCompileTimeAssert<true> {
public:
static inline void Check() { }
};
#define KALDI_COMPILE_TIME_ASSERT(b) KaldiCompileTimeAssert<(b)>::Check()
#define KALDI_ASSERT_IS_INTEGER_TYPE(I) \
KaldiCompileTimeAssert<std::numeric_limits<I>::is_specialized \
&& std::numeric_limits<I>::is_integer>::Check()
#define KALDI_ASSERT_IS_FLOATING_TYPE(F) \
KaldiCompileTimeAssert<std::numeric_limits<F>::is_specialized \
&& !std::numeric_limits<F>::is_integer>::Check()
三、模板形参
新用法
一、后置返回值类型(trailing return type)
使用形参类型推导返回值类型,需要后置返回值类型,并用auto占位
template<typename T, typename Y>
auto add(T v1, Y v2) -> decltype(v1 + v2)
{
return v1 + v2;
}
网友评论