Возможно ли иметь статическую часть c автоматической переменной c в C ++? - PullRequest
1 голос
/ 06 января 2020

Я бы хотел, чтобы часть памяти c была связана с переменной c, например:

#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 C (aa, bb) будет иметь ассоциированный StaticFriend, который будет инициализирован один раз и затем сможет хранить информацию между жизненными циклами соответствующего C. Таким образом, в примере есть два C (aa и bb), и у каждого есть свой собственный StaticFriend.

Кроме того, что у меня есть отдельный StaticFriend, как я показал в моем примере, Есть ли способ сделать это 1026 *? (Я не хочу одну переменную stati c в классе ... больше похоже на одну переменную stati c в каждом классе экземпляр .)

Мой вариант использования для регистрации с использованием boost::log. Я все еще пытаюсь найти наилучший способ его использования, но похоже, как работает фильтрация, вы запускаете событие журнала с open_record (создавая автоматическую переменную c в точке использования), и если серьезность или что-то в этом роде так, что запись не будет отправлена, никаких дальнейших действий с этим событием журнала не происходит. Но я хотел бы посчитать количество раз и собрать статистику времени для события, даже если оно не регистрируется. Поэтому я понимаю, что мое событие журнала может щекотать stati c, прежде чем решить, продолжать ли, stati c может записать минимальную информацию, которую я хочу.

1 Ответ

1 голос
/ 06 января 2020

Способ взлома препроцессором (с небольшим количеством добавленного кода, чтобы показать, что возможно с 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
...