template <typename T>
class MyPair{
T value[2];
};
template <typename T>
T GetMax(T a, T b){
return a > b ? a : b;
}
模板特例化和模板重载函数可以共存,编译期针对不同的数据类型,生成多个版本的函数,c++11之后可以使用constexpr常量表达式,写编译期代码
template <>
class MyPair<int>{
int value[2];
};
template <typename T>
int Size(T a){
return 1;
}
template <typename S,typename... T>
int Size(S a, T... b){
return Size(b...)+1;
}
int ii = Size(1,2,4,5); //size= 4
类模板参数
template <template <typename T> class Thing>
class Crab{}
Crab<Stack> a;//使用模板作为类模板
函数模板参数
template<typename... Args>
void init(int maxsize, Args&&... args){
std::call_once(flag_, &connection_pool<DB>::template init_impl<Args...>, this, maxsize, std::forward<Args>(args)...);
}
template<typename... Args>
void init_impl(int maxsize, Args&&... args){}
std::decay<vector>::type::value_type 获取vector内部的类型 std::is_same_v<T, bool&> 变量 std::remove_reference::type 变量 std::enable_if<condition>::type 条件满足返回类型,不满足无类型编译错 decltype 编译期获取变量类型 std::declval 推到模板T的对象值 if constexpr () 编译期的条件判断,根据constexpr内部生成多条代码
模板执行在编译器,所以模板成员只要传入的参数匹配,写固定的成员变量,只要编译过了也是可以的