变量模板

#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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值