2017-08-14 136 views
0

我无法准确理解下面的C++代码行。
为什么第1行在T没有出现在第1行时使用模板?这是否意味着当结构位被声明为特定模板类型时(如bits<float>),它只是在结构体内部typdef unsigned char type;无模板变量的模板类型和使用此类模板的其他模板类型

在第2行,这是否意味着如果我声明struct bits<const float>,它也intitlaizes结构bits<float>使用第1行?意思是像bits<float>
如果有人解释这段代码正在做什么,或者将我引荐给有关此主题的好参考,我将不胜感激。

/// Type traits for floating point bits. 
    template<typename T> struct bits { typedef unsigned char type; }; // line 1 
    template<typename T> struct bits<const T> : bits<T> {}; // line 2 
    template<typename T> struct bits<volatile T> : bits<T> {}; // line 3 
    template<typename T> struct bits<const volatile T> : bits<T> {}; // line 4 
+1

这与** C **没有任何关系。 C和C++在位级别上是完全不同的语言 - C中没有模板。请停止垃圾邮件标签。 –

+0

我想有一些其他的(完整的)专业化,否则部分专业化大多是无用的。 – Jarod42

回答

2

没有理由模板参数必须被模板使用。未使用的参数可用于描述与模板参数本身无关的模板化类/函数/变量的不同版本。

template<int N> bool f(); 
template<1> bool f(){return true;}; 
template<0> bool f(){return false;}; 

在第2行,bits<const T>bits<T>继承。它不是初始化一个bits<T>的实例,而是获得它的所有部分,就好像它是它自己的一部分一样。在初始化bits<const T>时发生的所有事情是它将定义类型type,就像它为bits<T>一样。

+0

哦,我明白了,我忘了它是C++广告':位'表示继承。 (但在我的问题,我说'bits '是基类:))。从你的回答中,我明白第一行只是基本(母类)模板,与没有具体类型无关,下面的行是模板类的'专业化'!谢谢! –

+0

然后,我们可以写第一行为'template struct bits {typedef unsigned char type; };'以及? –