如何使C++构造跟踪类参数?

Mr.*_*Tao 5 c++ debugging constructor

在阅读C++上的Ruminations时,我发现Obj_trace类用于通过简单地将它作为跟踪对象类声明的一部分来跟踪对象的构造:

class Foo {
public:
    …
    Obj_trace xxx;
}
Run Code Online (Sandbox Code Playgroud)

它产生的输出如下:

Object 1 constructed
Object 2 constructed
Object 1 destroyed
Object 3 constructed
Run Code Online (Sandbox Code Playgroud)

这适用于一个类.现在我想知道如何让它同时使用更多的类,产生类似于这个的输出:

Foo: Object 1 constructed
Bar: Object 1 constructed
Foo: Object 2 constructed
Run Code Online (Sandbox Code Playgroud)

我遇到过的最接近的解决方案是Nick Gammon的这篇文章,不过我想知道是否有办法使其无需继承,并且可能有超过1个字符的描述.

class Obj_trace {
    static int count;
    int ct;

public:
    Obj_trace() : ct(++count) {
        cout << "Object " << ct << " constructed" << endl;
    }

    ~Obj_trace() {
        cout << "Object " << ct << " destroyed" << endl;
    }

    Obj_trace(const Obj_trace & ) : ct(++count) {
        cout << "Object " << ct << " copy-constructed" << endl;
    }

    Obj_trace( Obj_trace && ) : ct(++count) {
        cout << "Object " << ct << " move-constructed" << endl;
    }

    Obj_trace & operator =( const Obj_trace & ) {
        cout << "Object " << ct << " copy op =" << endl;
        return *this;
    }

    Obj_trace & operator =( Obj_trace && ) {
        cout << "Object " << ct << " move op =" << endl;
        return *this;
    }
};

int Obj_trace::count = 0;
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 5

template<typename Outer>
class Obj_trace;
Run Code Online (Sandbox Code Playgroud)

并使用它

Obj_trace<Foo> xxx;
Run Code Online (Sandbox Code Playgroud)

这也将为每个对象类型提供单独的计数.在里面Obj_trace,您可以使用typeid(Outer)获取type_info类型名称.