为什么可变参数模板在C ++中的行为如此?

米娜·阿什拉夫(Mina Ashraf)

我需要帮助来理解这段代码。没有可用的循环,所以我知道在编译时如何处理模板,如何获取所有参数,为什么它调用相同的变量“ c”,即使仅在专用Z版本中,该变量也被增加了

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

using namespace std;

class Z
{
    Z() {}
    virtual ~Z() {}
};

class A
{
    A() {}
    virtual ~A() {}
};

class B
{
    B() {}
    virtual ~B() {}
};

template <class P, class... args>
class TCount : public TCount<args...>
{
public:
    TCount() : TCount<args...>() { this->c++; }
    virtual ~TCount() {}
};

template <>
class TCount<Z>
{
protected:
    int c;

public:
    TCount() { c = 0; }
    int getC() { return c; }
    virtual ~TCount() {}
};

int main()
{
    TCount<A, B, A, B, Z> tCount;
    cout << tCount.getC() << endl;
    return 0;
}
最高66

诀窍在于类定义的递归。

我的意思是...当你定义

TCount <A,B,A,B,Z> tCount;

你有

  • TCount<A,B,A,B,Z> 继承自 TCount<B,A,B,Z>
  • TCount<B,A,B,Z> 继承自 TCount<A,B,Z>
  • TCount<A,B,Z> 继承自 TCount<B,Z>
  • TCount<B,Z> 继承自 TCount<Z>
  • TCount<Z>定义c并将其初始化为零
  • TCount<B,Z>继承c并在body构造函数中将其递增(c成为1
  • TCount<A,B,Z>继承c并在body构造函数中将其递增(c成为2
  • TCount<B,A,B,Z>继承c并在body构造函数中将其递增(c成为3
  • TCount<A,B,A,B,Z>继承c并在body构造函数中将其递增(c成为4

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么constexpr在可变参数模板中不是常量?

如何在C ++中存储可变参数模板参数?

C ++中没有参数可变参数模板函数

用可变参数模板在C ++中包装函数指针

C ++ 11中的可变参数模板和多重继承

无法理解C ++中的可变参数模板

在 C++ 中扩展多模式可变参数模板

C ++在可变参数模板中获取许多元素

在C ++中为可变参数模板定义子包

为什么YouTube的缓冲/加载行为在Chrome中如此可怕?

在C ++中的可变参数模板中获取可变参数size_t ...参数的总和

C ++可变参数模板在可变参数宏中起作用

可变参数模板中的函数顺序

可变参数模板中的求和类型

迭代可变参数模板中的类型

C ++模板元编程,带有可变参数模板以执行结构中特定成员的操作

如何在现代C ++中基于另一组可变参数模板参数表示可变参数模板类型?

如何在SWIG中包装可变参数模板类的可变参数模板成员函数?

在C ++中可变参数模板中是否有对函数参数实施类型限制的好方法?

可变参数模板类中需要什么前向声明?

可变参数模板和std :: array意外行为

在 C++ 函数模板中,为什么我不能使用 lambda 来指定参数的数组大小?

如何从可变参数模板参数中删除元素?

Typedef中的可变参数模板解包参数

在没有参数的可变参数模板中迭代

层次结构中的反向可变参数模板参数

std :: function中的可变参数模板参数匹配

如何匹配可变参数模板中的空参数包

可变参数模板:组中展开参数