如何跟踪相同/不同数据类型的静态变量

时间:2013-04-11 13:17:42

标签: c++ templates static

下面的类Test有一个静态变量计数,它在创建类Test的对象时递增,

#include <iostream>

using namespace std;

template <class T> class Test
{  
private:
  T val; 
public:
  static int count;
  Test()
  {
    count++;
  }
  // some other stuff in class
};

template<class T>
int Test<T>::count = 0;

int main()
{
  Test<int> a;  
  Test<int> b;  
  Test<double> c;  
  cout << Test<int>::count   << endl;  // prints 2  
  cout << Test<double>::count << endl; //prints 1

  getchar();
  return 0;
}

输出:   2   1

我猜测试和测试有两个实例(同时调用Test和Test)。但我想知道为什么int和double有两个实例,因为有两种不同的类型?如果是这样,如何跟踪不同数据类型和相同数据类型的计数变量?这可能是一个简单的问题,但我只是想知道它背后的基本过程?

4 个答案:

答案 0 :(得分:0)

由于Test<int>Test<double>是不同的类型。

类模板定义了一组无限相关类型的布局和操作。

答案 1 :(得分:0)

是。有两种不同类型的Test。一个基于intTest<int>。另一个基于doubleTest<double>

您可以假设有两个Test类:

class Test_int // Test<int>
{  
private:
  int val; 
//...

class Test_double // Test<double>
{  
private:
  double val; 
//...

答案 2 :(得分:0)

你有2个不同的班级。

每个指定的类模板都是不同的类类型 因此,Test<int>是类型的类名,与Test<double>不同。

编译器为每个类生成单独的代码,因此有2个不同的静态变量。

还有更多,它将为包含标题的每个编译单元创建代码(因为代码将在需要的地方“注入”)。

因此,如果您将在2个不同的.cpp文件中的2个不同的类中打印它,您将看到每个编译单元都有一个不同的计数器,即使对于相同的模板类类型也是如此。

答案 3 :(得分:0)

是的,你得到一个实例:

template<class T>
int Test<T>::count = 0;

适用于T的每种类型。当然是实例化的

  Test()
  {
    count++;
  }

想象一下,你添加了:

  Test()
  {
    val = 0;
    count++;
  }

您可以立即了解为什么必须为每种类型提供其他功能。 Test<int>Test<double>不同。

每个count变量的全名是:

Test<int>::count
Test<double>::count

编译器将分别“编辑”成count_Test$i_icount_Test$D_i的某些内容(我刚刚提到了,实际上它可能完全不同)