繁体   English   中英

带有默认参数的C ++模板类,可能还有元编程

[英]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个问题:

  1. 第一个模板测试类( template后面的<>,而不是类名)和第二个模板测试类之间有什么区别(类名为Test后面带有<>)。
  2. 为什么两个相同的类(都命名为Test )可以同时存在。
  3. 事实上,当is类PT被设置为真,程序将打印出PixType B=true ,否则PixType B=false ,我不知道这里的神奇。
  4. 我试图将第二个模板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点事实上,当isclass 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM