На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> хочу опробовать глупый указатель
    Здравствуйте!

    хочу получить тупой указатель или даже точнее ссылку на значение. И кажись, такая фиговина, даже существует std::reference_wrapper.

    Я вообщем-то могу взять нативный указатель. Но главная идея, позаморачиваться, с чем-то новым. Тем более, что подвернулась задачка.

    В классе pool храниться пул функторов.
    ExpandedWrap disabled
      class pool
      {public:
      typedef std::tuple< mi_func, int, bool, name > mi_tuple;
      typedef std::vector< mi_tuple > mi_vector;
      mi_vector functors;
       
      public:
       
      /* создаёт узел обработчика. */
      std::shared_ptr<node> create( int id )
      {
      return std::make_shared< node >(
      this->functors.at(id).get<0>(), /* функтор. */
      std::ref( this->functors.at(id).get<1>() ) /* ссылка на счётчик. */
      );
      }
       
      };


    Так вот, правомочно ли подобное?

    ExpandedWrap disabled
      class node
      {
      mi_func functor
      std::reference_wrapper<int> count;
      public:
       
      /* конструктор. */
      node( mi_func func, std::reference_wrapper<int> x ):
      count( x )
      {
      this->functor = func;
      this->count++;
      }
       
      /* деструктор. */
      ~node()
      {
      this->count--;
      }
       
      void call( message_ptr msg )
      [{
      if( 1 == thiscount )
      {
      this->functor( msg );
      }
      }
       
      };


    Нужно подсчитывать число узлов с конкретным функтором. Объекты узлов могут работать в разных потоках.

    Повторюсь, я конечно могу заюзать указатели. А вот что даст std::reference_wrapper?

    Даст ли профит использование std::tuple? И можно ли его так заюзать?

    Может быть, нужно счётчик делать атомарным std::atomic_int?

    Поясню для любопытствующих, хочу сделать, чтоб только один узел был активным, а остальные спали и ждали, когда предыдущий разрушится. Просто, я часть механизма проверки пропустил. Так что сейчас функтор просто заблочится. Об этом знаю, но к сабжу не относиться. И всё ещё может сильно поменяться.
    Сообщение отредактировано: Eric-S -
      Ну... Вообщем можно, только не стоит оно того. Всё равно, синтаксис получается, как для указателя. Плюс ещё дополнительные символы.
      Так что юзать нативные указатели и не париться.
        std::stupid_pointer
          Цитата ter_nk_ @
          std::stupid_pointer
          Глупый, а не тупой, уж тогда std::silly_pointer.

          Добавлено
          Оттенок разный слегка, по крайней мере нас так учили :lol:
            Цитата Axis @
            std::silly_pointer

            Противоположный смысл smart_ptr. std::weak_ptr шибко закрытый.

            А воообщем, всё не то. Просто, разброд между "operator." и "operator->" иногда начинает раздражать. В функторы значение передаётся по ссылке, в обёртке std::reference_wrapper. Но это самая примитивная обёртка. Использовать её не реально.

            Можно было бы написать свою обёртку, предоставляющую доступ к указателю. Но запрещающего его удаление или изменение. А ещё требующей обязательной инициализации при создании.


            ExpandedWrap disabled
              template< typename T >
              class silly_ptr
              {
              public:
              typedef T element_type;
              typedef T const*const const_pointer_type;
              typedef T *pointer_type;
              typedef const T &const_reference_type;
              typedef T &reference_type;
               
              /* конструктор. */
              explicit silly_ptr( pointer_type p ):
              _element( p )
              {
              if( nullptr == p )
              {
              throw std::invalid_argument( "null pointer to element" );
              }
              }
               
              /* деструктор. */
              ~silly_ptr()
              {
              }
               
              /* разъименование. */
              const_reference_type operator*() const
              {
              return *(this->_element);
              }
               
              /* разъименование. */
              reference_type operator*()
              {
              return *(this->_element);
              }
               
              /* доступ к члену. */
              const_pointer_type operator->() const
              {
              return this->_element;
              }
               
              /* доступ к члену. */
              pointer_type operator->()
              {
              return this->_element;
              }
               
              private:
              silly_ptr( std::nullptr_t ) {}
               
              /* указатель на элемент */
              pointer_type _element;
              };


            И так далее и тому подобное. Надо подумать, что ещё пригодиться, а чего нужно запретить. Да и мой const_pointer_type спорен, ох, как спорен.
            Нужен ли оператор взятия адреса?

            Арифметику, доступ по индексу, оператор вызова, и прочие умности, ясное дело в топку.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0506 ]   [ 16 queries used ]   [ Generated: 20.04.24, 00:00 GMT ]