#include <iostream>
#include <string>
#include <vector>
#include <array>
// 变量模板,这种定义最好不要出现在函数内部或块作用域内部
template<typename T>
T var{}; // 可以进行初始化,也可以不初始化
template<typename U>
// constexpr修饰的需要进行初始化,3.24对应类型只能是float、double等数字类型
// std::string等其他类型,不能转换,会编译错误
constexpr U cvar{3.24};
// 函数模板、类模板有默认模板参数,变量模板当然也有默认模板参数
template<typename T=int>
T defaultVar{};
void Test(){
var<int> = 10;
std::cout<<var<int><<std::endl;
var<std::string> = "hello";
std::cout<<var<std::string><<std::endl;
std::cout<<cvar<float><<std::endl;
std::cout<<cvar<double><<std::endl;
// std::cout<<cvar<std::string><<std::endl; // error,not convertiable
std::cout<<defaultVar<><<std::endl;// use default template para type
defaultVar<std::string> = "world";
defaultVar<std::vector<int>> = {1,2,3,4};
std::cout<<defaultVar<std::string><<std::endl;
for (auto it: defaultVar<std::vector<int>>) {
std::cout<<it<<std::endl;
}
}
// 同样可以使用非类型模板参数对变量模板进行参数化
template<size_t N>
std::array<int, N> arr{};
template<auto N>
decltype(N) dval = N;
void Test1(){
arr<3> = {1,2,3};
for (auto it: arr<3>) {
std::cout<<it<<std::endl;
}
std::cout<<dval<10><<std::endl;
std::cout<<dval<'a'><<std::endl;
}
// 成员变量模板化
template<typename T>
struct Member{
static const int max{10};
std::string name{"ts"};
};
// 定义变量模板替换类成员变量
template<typename T>
int maxType = Member<T>::max;
void Test2(){
auto intTypeVar = Member<int>::max;
auto strTypeVar = Member<std::string>::max;
std::cout<<intTypeVar<<std::endl;
std::cout<<strTypeVar<<std::endl;
std::cout<<maxType<int><<std::endl;
std::cout<<maxType<std::string><<std::endl;
}
// 继承true/false_type进行偏特化判断
template<typename T1, typename T2>
struct IsSameT: std::false_type{};
template<typename T>
struct IsSameT<T, T>: std::true_type{};
// 变量模板,使用偏特化模板进行初始化,由于value是值而不是type,不要和using 别名混淆
template<typename T1, typename T2>
constexpr bool IsSame = IsSameT<T1, T2>::value;
void Test3(){
// 相当于IsSameT<T1, T2>::value简化为IsSame<T1,T2>
std::cout<<std::boolalpha;
std::cout<<IsSame<int, int><<std::endl; // true
std::cout<<IsSame<int, long><<std::endl;// false
}
int main()
{
Test();
Test2();
Test3();
}
变量模板
于 2022-08-21 22:25:22 首次发布