我想让一块静态内存与一个自动变量关联,像这样:
#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(aa
,bb
)都将具有一个关联的StaticFriend
,该关联将被初始化一次,然后能够在相应C的生命周期之间存储信息。因此,在示例中,是两个C(aa
和bb
),每个都有自己的StaticFriend
。
除了我在示例中显示的那样拥有一个单独的StaticFriend之外,还有什么方法可以完成此操作? (我不希望类中有一个静态变量……更像每个类中的[[instance中有一个静态变量。)]
我的用例是使用boost::log
进行记录。我仍在尝试找出使用它的最佳方法,但是它看起来像过滤的方式,您可以使用open_record
启动一个日志事件(在使用时创建一个自动变量),以及严重性或不管将不会发出记录的情况如何,该日志事件都不会发生进一步的活动。但是我想计算事件的次数并收集有关该事件的计时统计信息,即使它没有被记录下来。因此,在决定是否继续之前,我想知道我的日志事件是否可以为静态事件挠痒痒,该静态事件可以记录我想要的最少信息。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