一:定义,泛化,全特化,偏特化,使用方法
#include#include using namespace std; //变量模板的泛化版本 template //(1) T g_tmp{};//变量的零初始化方式 //变量模板的全特化,,这里的char可以和int不一样 template<>//(2) char g_tmp {'a'}; //变量模板的偏特化,从参数范围上的偏特化,必须要求是T*,依赖于T template //(3) T g_tmp {10}; //变量模板的偏特化,从参数范围上的偏特化,必须要求是T*,依赖于T template //(4) T g_tmp {100}; int main() { //变量模板的,泛化,偏特化,以及全特化和使用 g_tmp = 20; std::cout << g_tmp << std::endl; g_tmp ; std::cout << g_tmp << std::endl; g_tmp ; std::cout << g_tmp << std::endl; g_tmp ; std::cout << g_tmp << std::endl; return 0; }
二:变量模板默认模板参数
#include#include using namespace std;  //变量模板,默认模板参数 template T g_tmp{};//变量的零初始化方式 int main() { g_tmp = 5; g_tmp<> = 15; printf("%p,%dn", &g_tmp , g_tmp ); printf("%p,%dn", &g_tmp<>, g_tmp<>); return 0; }
三:非类型模板参数
#include#include using namespace std; //变量模板,非类型模板参数 template T g_tmp[value]{};//变量的零初始化方式 int main() { for (int i = 0; i < 15; i++) { g_tmp [i] = i; //g_tmp 出现就代表定义了g_tmp[value]这么一个数组 } for (int i = 0; i < 15; i++) { std::cout << g_tmp [i] << 't'; } return 0; }
四:变量模板的另一种形式
#include#include using namespace std; //变量模板,另一种表现形式 template struct B { const static T value = { 160 }; //const也可以写成constexpr,{}也可以不加,注意是静态成员变量 }; template int g_tmp = B ::value; //注意g_tmp是个变量模板 int main() { cout << g_tmp << endl; //160,g_tmp 相当于B ::value printf("%pn", &g_tmp ); printf("%pn", &B ::value); g_tmp = 152; cout << g_tmp << endl; //152 //cout << B ::value << endl; //160 return 0; }
五:成员变量模板
#include#include using namespace std; template class TMP { public: template //U m_i = {}; 只可以使用静态成员变量 static U m_i; }; template template U TMP ::m_i = 10; int main() { TMP ::m_i = 100; return 0; }



