template <bool, class t, class u>// why is bool here,class booltype=bool. Are they equivalent?
struct if_
{
typedef typename t type;
};
template<class t, class u>
struct if_<false, t, u> // what does the <false,t,u> mean?
{
typedef typename u type;
};
代码来自名为“命名模板参数”的文章。我无法理解这两种结构的定义。
答案 0 :(得分:4)
if_<true, int, double>::type; // this is int
if_<false, int, double>::type; // this is double
这可以方便地定义一个可以在编译时有条件地定义的类型。
template <bool, class t, class u>// why is bool here,class booltype=bool. Are they equivalent?
struct if_
{
typedef typename t type;
};
这意味着传递给模板的第一个参数是bool
。
它不等同于class booltype=bool
。这将是模板的默认typename
。
template<class t, class u>
struct if_<false, t, u> // what does the <false,t,u> mean?
{
typedef typename u type;
};
这是您struct
的专业化。如果传递给模板的第一个参数为false,则将struct
定义为。
基本上,假设:
if_<true, int, double> x;
//is defined as
//struct if_
//{
// typedef int type;
//};
和
if_<false, int, double> x;
//is defined as
//struct if_
//{
// typedef double type;
//};
符号基本上告诉了什么是typedef - 如果第一个参数是true
,typedef
是第二个参数,否则是第三个参数。
答案 1 :(得分:0)
第一个是类型if_
的通用模板定义。 bool是模板参数(模板参数可以是类型或整数值)
第二个是同一模板的部分特化。 PArtial专业化意味着您设置了一些模板参数,但不是全部。
使用哪一个是这样决定的:如果实际模板参数存在明确的特化,则使用该特化,否则使用非专用(本例中为forst定义)。非专业版本作为“默认”选择
答案 2 :(得分:0)
struct if_<false, t, u>
是主模板if_
的部分特殊化,只要模板的第一个参数的值为false
,编译器就会对其进行实例化,而不管其他两个“类型” α参数”。您在这里处理“非类型”模板参数。此构造的主要目的是选择类型t
或类型u
,具体取决于第一个参数的值,以便
if_<true, int, double>::type
的类型为int
和
if_<false, int, double>::type
的类型为double
。不可否认,如果它是你与c ++元编程的“第一次接触”,那么基本上你得到了编译器在编译时评估的传统if
语句的等价物。