在C ++中是否可以具有自动变量的静态部分?

问题描述 投票:1回答:1

我想让一块静态内存与一个自动变量关联,像这样:

#include <iostream>
using namespace std;

class StaticFriend {
  public:
    /**/         StaticFriend( void ) { }
} ;

class C {
  public:
    /**/         C( StaticFriend &f ) : myFriend( f ) { }
  private:
    StaticFriend &myFriend;
} ;

int
main( int argc, char **argv, char **envp )
{
    static StaticFriend  a;
    C                    aa( a );

    cout << "hello, world" << endl;

    static StaticFriend  b;
    C                    bb( b );

    cout << "goodbye, world" << endl;

    return 0;
}

这个想法是,每个自动C(aabb)都将具有一个关联的StaticFriend,该关联将被初始化一次,然后能够在相应C的生命周期之间存储信息。因此,在示例中,是两个C(aabb),每个都有自己的StaticFriend

除了我在示例中显示的那样拥有一个单独的StaticFriend之外,还有什么方法可以完成此操作? (我希望类中有一个静态变量……更像每个类中的[[instance中有一个静态变量。)]

我的用例是使用boost::log进行记录。我仍在尝试找出使用它的最佳方法,但是它看起来像过滤的方式,您可以使用open_record启动一个日志事件(在使用时创建一个自动变量),以及严重性或不管将不会发出记录的情况如何,该日志事件都不会发生进一步的活动。但是我想计算事件的次数并收集有关该事件的计时统计信息,即使它没有被记录下来。因此,在决定是否继续之前,我想知道我的日志事件是否可以为静态事件挠痒痒,该静态事件可以记录我想要的最少信息。
c++ boost static
1个回答
0
投票
一种预处理器破解方法(添加了一些代码来显示StaticFriend的可能。

#include <iostream> #include <string> using namespace std; class StaticFriend { public: /**/ StaticFriend( const char *w ) : where( w ), count( 0 ) { cout << "create a StaticFriend at 0x" << hex << (unsigned long)this << endl; } /**/ ~StaticFriend( void ) { cout << "Automatic variable " << where << " came into scope " << count << " times" << endl; } void tickle( void ) { ++count; } private: string where; unsigned count; } ; class C { public: /**/ C( StaticFriend &f ) : myFriend( f ) { cout << " C@0x" << hex << (unsigned long)this << " has StaticFriend at " << (unsigned long)(&myFriend) << endl; myFriend.tickle( ); } /**/ ~C( void ) { cout << "~C@0x" << hex << (unsigned long)this << endl; } private: StaticFriend &myFriend; } ; #define str_(x) #x #define str(x) str_(x) #define autoC( name, ... ) static StaticFriend name##_(#name " at " __FILE__ ":" str(__LINE__)); C name( name##_ ##__VA_ARGS__ ) int recurse( int depth ) { autoC( x ); cout << "recurse( " << depth << ")" << endl; if (depth > 0) recurse( depth - 1 ); } int main( int argc, char **argv, char **envp ) { cout << "Hello, world" << endl; recurse( 3 ); cout << "Goodbye, world" << endl; return 0; }

输出:

$ ./test Hello, world create a StaticFriend at 0x562fae948200 C@0x7ffe6bab9ea8 has StaticFriend at 562fae948200 recurse( 3) C@0x7ffe6bab9e68 has StaticFriend at 562fae948200 recurse( 2) C@0x7ffe6bab9e28 has StaticFriend at 562fae948200 recurse( 1) C@0x7ffe6bab9de8 has StaticFriend at 562fae948200 recurse( 0) ~C@0x7ffe6bab9de8 ~C@0x7ffe6bab9e28 ~C@0x7ffe6bab9e68 ~C@0x7ffe6bab9ea8 Goodbye, world Automatic variable x at test.cc:51 came into scope 4 times

© www.soinside.com 2019 - 2024. All rights reserved.