注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

(转载及分析)C++11及BOOST特性之三十C++14中的变量模板(Variable Templates)  

2016-09-01 10:40:39|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++11BOOST特性之三十C++14中的变量模板(Variable Templates

变量模板是在新的14标准中提出来的,C++14可以认为是一个中间过渡的标准,许多重量级的改动都推到C++17了。

但是大家都知道,在以前有类模板,有函数模板,那么为什么没有变量模板呢?就是因为这个,才推出了变量模板,它来了。

其下为转载:

http://blog.csdn.net/lanchunhui/article/details/49835213

 

C++基础::变量模板(variable template

标签: 变量模板

2015-11-14 13:24 236人阅读 评论(0) 收藏 举报

 分类: C/C++217 

既然允许C++模板类(class template)的存在,允许C++函数模板(function template)的存在,也应当允许变量模板(variable template)的存在。

引入

 

变量模板,标准C++14C++11C++14的一个subset子集,)的一个新的语法特性。C++新标准引入变量模板的主要目的是为了简化定义(simplify definitions)以及对模板化常量(parameterized constant)的支持。

 

C++14之前的语法规则不允许使用模板声明的方式声明一个变量

 

template<typename T>

T var;              // not allowed in pre-C++14

var<int> = 5;           // == (int var = 5;)

它足够新,以至于相当多的编译器还未完全支持,比如windows下的vs2013。本文涉及的代码统一在C++的一个在线ide——ideone中进行编译(选择这个编译器的目的主要在于它对C++14标准的支持)。

大家可以在http://ideone.com来模拟编程,毕竟有好多主流的编译器目前尚未支持完整的最新的C++标准。

在线编译器c++标准可选

 

条条大陆通罗马,此路不通(C++14标准之前),我们虽然有一些另外的替代方案,但这些方案,往往冗余度过高且形式比较复杂。

workaround 1

 

第一种替代方案是,使用类模板的constexpr static数据成员的方式:

 

template<typename T>

struct PI

{

    constexpr static T pi = T(3.1415926535897932385);

    // 这里必须使用关键字constexpr,而不可以是const

    // const 常量必须在编译器得到确定

    // C++11起,constexpr可以让表达式核定于编译期

}

 

// duplicate declaration

template<typename T>

constexpr T PI<T>::pi;

 

int main(int, char**)

{  

    std::cout << PI<int>::pi << std::endl; 

                                        // 3

    std::cout << PI<double>::pi << std::endl;  

                                        // 3.14159

    return 0;

}

这种做法,因为constant是一种ODROne Definition Rule)的定义规则。对constant的两次声明是有必要的,一次在类模板体内,一次在类模板体外,如上代码所示。

 

workaround 2

 

另外一种解决方案是使用constexpr函数模板的形式,该函数返回期待的类型。

 

template<typename T>

T PI()

{

    constexpr T pi = T(3.1415926535897932385);

    return pi;

}

 

int main(int, char**)

{

    std::cout << PI<int>() << std::endl;

    std::cout << PI<double>() << std::endl;

    return 0;

}

 

variable template

 

现在,有了C++新标准对变量模板的支持,操纵一个可变类型的常量可以得到显著的简化,

 

// old version

PI<int>::pi     // constexpr static data member

PI<int>()       // constexpr function

 

// new version

PI<int>

template<typename T>

constexpr T PI = T(3.1415926535897932385);

template<typename T>

T area(T r)

{

    return PI<T>*r*r;

}

 

int main(int, char**)

{

    std::cout << PI<int> << std::endl;

    std::cout << area(2.0) << std::endl;   

                // 函数模板的自动类型推导

    return 0;

}

当然我们亦可以将变量模板应用到一个非常量变量上来;

 

tempalte<typename T>

T val = T(3.1415926535897932385);

 

int main(int, char**)

{

    val<float> = 0.6180339887498948482;

    std::cout << val<float> << std::endl;  

                // 使用新赋的值

    std::cout << val<double> << std::endl;

                // 使用默认值

    return 0;

}

References

 

[1] <Introduction to Variable Templates of C++14>

同时还可以参看上面提到的:

https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/Introduction_to_Variable_Templates_of_C_14?lang=en

转载完了。

记得前些日子在网上或者哪儿找到过,后来怎么也找不到了,算是无语。所以没办法了,只好重新找,这次学乖了,找着就记下来,好记性不如烂笔头,当初中学老师可是这么教的,现在发现,真是这样,再说,哥的记性又不好。

学以致用,这才是王道。

  评论这张
 
阅读(69)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017