在前面的“C++11中對(duì)模板的支持”中,對(duì)變量模板進(jìn)行過(guò)基本的描述。變量模板的用處也分析的比較簡(jiǎn)單,本篇文章專門把這個(gè)變量模板拿出來(lái),對(duì)其進(jìn)行更詳細(xì)的說(shuō)明。c++14以后,c++的新的標(biāo)準(zhǔn)提供了對(duì)變量模板的支持。變量模板的作用,其實(shí)仍然是對(duì)模板編程的支持,簡(jiǎn)化定義,增加對(duì)模板化常量的支持。其基本的語(yǔ)法形式如下:

template< parameter-list >variable-declaration
variable-declaration - a declaration of a variable. The declared variable name becomes a template name.
parameter-list - a non-empty comma-separated list of the template parameters, each of which is either non-type parameter, a type parameter, a template parameter, or a parameter pack of any of those.按上面的語(yǔ)法表示可以看出,變量模板的定義還是非常簡(jiǎn)單的,它的模板參數(shù)支持非類型形參、類型形參和模板形參。
二、作用和應(yīng)用1、基礎(chǔ)使用
看一個(gè)基本的定義:
templateT Var{};//零初始化Var 模板可以有默認(rèn)的模板實(shí)參,先看一下大家廣為熟悉的PI的定義:
templateconstexpr T pi = T{3.1415926535897932385}; 2、對(duì)模板化常量的支持
其實(shí)就是對(duì)默認(rèn)值的定義,仍然以PI為例程:
templateconstexpr T pi = T(3.1415926535897932385L); // 變量模板;需要推導(dǎo)T的類型 3、非類型模板參數(shù)
非類型模板參數(shù)一般是指整數(shù)類型、指針和成員指針類型以及左值引用類型、枚舉類型(c++11起);另外從c++20開始支持浮點(diǎn)類型和一些特定的字面類型。看下面的例子:
templatestd::arrayarr{}; // N個(gè)元素的數(shù)組,零初始化(譯注,使用initializer進(jìn)行初始化)
template
constexpr decltype(N) dval = N; // dval的類型依賴于傳入的值;C++20起支持auto 4、數(shù)據(jù)成員的簡(jiǎn)化使用
在以前的模板類成員的使用過(guò)程中,在引用類模板中的靜態(tài)成員時(shí),還是有點(diǎn)復(fù)雜,看一下例子:
templateclass Min
{
public:
static constexpr int min = 1;
};
//使用
auto min = Min::min 而如果使用變量模板對(duì)不同的情況進(jìn)行特化:
//特化定義
templateint myMin = Min::min;
//使用
auto min = myMin;
另外一個(gè)就是從c++17起對(duì)類型后綴_v的簡(jiǎn)化,在c++17以前使用某個(gè)SFINAE中的函數(shù)時(shí),一般會(huì)有類似std::is_const::value的用法,但在之后就會(huì)見(jiàn)到std::is_const_v,采用就的就是變量模板定義的方式:
namespace std
{
templateconstexpr bool is_const_v = is_const::value;
} 5、變量模板全特化和偏特化
既然是模板就會(huì)有全特化和偏特化:
//全特化
templateconstexpr std::size_t SZ = sizeof(T);
template<>constexpr std::size_t SZ= 0;
//偏特化
templateconstexpr std::size_t SZ1 = sizeof(T);
templateconstexpr std::size_t SZ1= sizeof(void*);
在c++14以前即未引入變量模板以前,參數(shù)化變量一般使用類模板的靜態(tài)數(shù)據(jù)成員或者constexpr 函數(shù)模板來(lái)返回所需要的值。而有這個(gè)變量模板后,一切都變得簡(jiǎn)單了。
三、例程下面看一下具體應(yīng)用的例子:
//簡(jiǎn)化的例子和非類型參數(shù)
#include#include
templatestd::arrayarr{}; // 定義數(shù)組并初始化
template
constexpr decltype(N) dval = N;
void TestArray()
{
std::cout<< dval<'c'><< std::endl;
arr<10>[0] = 42; // 設(shè)置全局arr第1個(gè)元素的值
for (std::size_t i = 0; i< arr<10>.size(); ++i)
{ // 使用arr中的值
std::cout<< arr<10>[i]<< std::endl;
}
}
namespace mystd {
templateclass numeric_limits
{
public:
static constexpr bool is_signed = false;
};
}
//可以定義:
templateconstexpr bool isSigned = mystd::numeric_limits::is_signed;
void TestSimple()
{
bool sig = isSigned;
std::cout<< "mystd numeric_limits is:"<< sig<< std::endl;
}
int main()
{
TestArray();
TestSimple();
return 0;
} 再看一個(gè)返回值的例子:
//返回值例子
templateconstexpr T PI = T(3.1415926535897932385);
templateT VAL = T(3.1415926535897932385);
templateT circular_area(T r)
{
return PI*r*r;
}
int main()
{
VAL= 3.1415;
std::cout<< VAL<< std::endl;
std::cout<< VAL<><< std::endl;
std::cout<< PI<< std::endl;
std::cout<< PI<< std::endl;
std::cout<< circular_area(2.0)<< std::endl;
return 0;
}
對(duì)于常量和變量的表示,變量模板都可以很好實(shí)現(xiàn)。通過(guò)上面的例子可以清晰的看到其用法。習(xí)慣了C編程的同學(xué),可能說(shuō)用宏定義一個(gè)PI不更香么,這個(gè)就看你對(duì)語(yǔ)言理解的深度和廣度了,也考驗(yàn)每個(gè)開發(fā)人員對(duì)不同的開發(fā)場(chǎng)景的設(shè)計(jì)應(yīng)用了。
沒(méi)有最好,只有最合適。理論再好,不符合實(shí)際情況反而不妙。這個(gè)就需要每個(gè)人自己去思考。
從上面的變量模板的使用可以看出,其實(shí)這和模板進(jìn)一步編程風(fēng)格的統(tǒng)一有著很大的關(guān)系。當(dāng)然,在這個(gè)過(guò)程中,也將一些編程的復(fù)雜度進(jìn)一步降低,特別對(duì)一些本身就是一種常量的表示進(jìn)一步完善代碼風(fēng)格。換句話說(shuō),在統(tǒng)一編程風(fēng)格的基礎(chǔ)上,進(jìn)一步簡(jiǎn)化一些冗余的代碼表示。
總之,c++的模板編程是一個(gè)很重要的發(fā)展方向,對(duì)其不斷的進(jìn)行完善和發(fā)展也符合c++發(fā)展的目標(biāo)和希望。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
名稱欄目:跟我學(xué)c++中級(jí)篇——變量模板-創(chuàng)新互聯(lián)
分享地址:http://chinadenli.net/article22/cejpcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、軟件開發(fā)、品牌網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、微信公眾號(hào)、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容