模板类的唯一编号

时间:2015-10-30 17:22:11

标签: c++ templates static initialization

我希望设计一个模板类,它在所有类型中都有唯一的编号,如下所示。我想知道它是否可能或推荐的设计是什么?

template<typename T> class MyClass 
{
public:
    static int counter; // a unique counter shared by all instantiations (e.g float, double, int, etc)
    void increment() { counter++; }

    MyClass(T x) : val(x) {;}
    T val;
    void operations() { /* other operations on val */; }
};

3 个答案:

答案 0 :(得分:2)

template<typename T> class MyClass 
{
public:
    static int counter; // a unique counter shared by all instantiations

不完全。 MyClass的每个实例都会有不同的counter

  

我想知道它是否可能或推荐的设计是什么?

推荐的设计取决于您实际想要解决的问题类型。

从技术上讲,实现所需结果的一种简单明了的方法是将变量放入基类:

#include <iostream>

class MyClassBase
{
public:
    static int counter; // a unique counter shared by all instantiations (e.g float, double, int, etc)
};

int MyClassBase::counter = 0;

template<typename T> class MyClass : public MyClassBase
{
public:
    void increment() { counter++; }

    MyClass(T x) : val(x) {}
    T val;
    void operations() { /* other operations on val */; }
};

int main()
{
    MyClass<float> o1(0);
    MyClass<double> o2(0);
    MyClass<int> o3(0);

    o1.increment();
    std::cout << o2.counter << "\n";
    std::cout << o3.counter << "\n";
}

输出:

1
1

在实际代码中,您可能希望counter成为protected成员并使用private继承,而不是将基类和变量暴露给整个世界。

答案 1 :(得分:0)

这不是模板类的序列ID最差的实现。正如Duck所说,如果您输出并输入回来,它可能会回来困扰您。您需要在其中包含多个状态,例如typeref id以及您的序列ID才能正确实现此状态。这是个不错的主意。我认为你做得很好,你编程比那些刚刚开始的很多编程人员受过更好的教育。这种做法对于一个新的编程人员来说应该是有益的,他可以在他的作品集中让面试官看到。不要放弃。现在只需要typeref id。

答案 2 :(得分:0)

实际上,您实例化的不同类型将为counter设置不同的初始值。问这个问题就像问如果我有多个非模板化的类并且我想与所有这些类共享一个唯一的变量那么我将如何实现它?

方法可能是:

1。定义可访问所有类的全局变量。通常最好避免全局变量。

2. 创建一个Parent类,让你的templatized类在这个父类中定义(虽然你不能直接访问计数器变量但{{1}但是在这里,你至少要避免全球变量)

3。从父类继承模板化的类,并将您的计数器作为Parent类的一部分。