[英]C++ template class with default parameters, and probably metaprogramming
我在理解以下代码时遇到了麻烦:
#include <iostream>
using namespace std;
template <class PixType, bool B = PixType::is>
class Test {
public:
void print() {
cout << "PixType B=false" <<endl;
}
};
template <class PixType>
class Test<PixType,true> {
public:
void print() {
cout << "PixType B=true" <<endl;
}
};
class PT {
public:
static const bool is = false; // here is the magic
};
int main() {
Test<PT> t;
t.print();
}
我有4个问题:
template
后面的<>,而不是类名)和第二个模板测试类之间有什么区别(类名为Test
后面带有<>)。 Test
)可以同时存在。 is
类PT被设置为真,程序将打印出PixType B=true
,否则PixType B=false
,我不知道这里的神奇。 我试图将第二个模板Test类更改为:
template <class PixType, bool B= true> class Test { public: void print() { cout << "PixType B=true" <<endl; } };
但编译器会警告我名称冲突。
我对这些模板的东西很新,并且对这些代码行感到困惑。 我不知道如何搜索这个技巧。 在大多数关于C ++模板的文章中,他们只是谈论一些关于模板的基本思想和用法。
任何帮助将不胜感激。
第1点第一个模板测试类(模板后面的<>,而不是类名)与第二个模板测试类之间有什么区别(类名为Test后面带有<>)。
响应第一个是主类模板定义。 第二个是类模板的特化,其中模板的第二个参数为true
。
如果您没有第二个,则无论模板的第二个参数是true
还是false
都将使用第一个。
第2点为什么两个相同的类(都被命名为Test)同时存在。
响应在您的情况下,第二个是第一个的专业化。 当你使用:
Test<int, true> a;
编译器知道使用特化为Test<int, true>
生成代码。 当你使用:
Test<int, false> b;
编译器知道使用第一个为Test<int, false>
生成代码。
3点事实上,当is
在class PT
被设置为真,程序将打印出PixType B=true
,否则PixType B=false
,我不知道这里的神奇。
响应如上所述,当第二个参数为true
,编译器使用第二个类模板。 否则,它使用第一个类模板。 我希望不再有任何混淆。
第4点我试图将第二个模板Test类更改为:
template <class PixType, bool B= true>
class Test {
public:
void print() {
cout << "PixType B=true" <<endl;
}
};
但编译器会警告我名称冲突。
响应
类模板只能是专用的,它们不能重载。
template <typename A, typename B> class C1 {};
template <typename A> class C1 {};
语言不支持以上内容。
template <typename A, typename B> class C1 {};
template <typename A> class C1<A, A*> {};
以上内容受语言支持。 第二个类模板是第一个类模板的特化。
您要做的是为第二个参数提供默认值,但用于定义类模板的名称是相同的。 第二个是不同的类模板,而不是第一类模板的特化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.