Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.128.198.21] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте!
хочу получить тупой указатель или даже точнее ссылку на значение. И кажись, такая фиговина, даже существует std::reference_wrapper. Я вообщем-то могу взять нативный указатель. Но главная идея, позаморачиваться, с чем-то новым. Тем более, что подвернулась задачка. В классе pool храниться пул функторов. 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>() ) /* ссылка на счётчик. */ ); } }; Так вот, правомочно ли подобное? 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? Поясню для любопытствующих, хочу сделать, чтоб только один узел был активным, а остальные спали и ждали, когда предыдущий разрушится. Просто, я часть механизма проверки пропустил. Так что сейчас функтор просто заблочится. Об этом знаю, но к сабжу не относиться. И всё ещё может сильно поменяться. |
Сообщ.
#2
,
|
|
|
Ну... Вообщем можно, только не стоит оно того. Всё равно, синтаксис получается, как для указателя. Плюс ещё дополнительные символы.
Так что юзать нативные указатели и не париться. |
Сообщ.
#3
,
|
|
|
std::stupid_pointer
|
Сообщ.
#4
,
|
|
|
Цитата ter_nk_ @ Глупый, а не тупой, уж тогда std::silly_pointer. std::stupid_pointer Добавлено Оттенок разный слегка, по крайней мере нас так учили |
Сообщ.
#5
,
|
|
|
Цитата Axis @ std::silly_pointer Противоположный смысл smart_ptr. std::weak_ptr шибко закрытый. А воообщем, всё не то. Просто, разброд между "operator." и "operator->" иногда начинает раздражать. В функторы значение передаётся по ссылке, в обёртке std::reference_wrapper. Но это самая примитивная обёртка. Использовать её не реально. Можно было бы написать свою обёртку, предоставляющую доступ к указателю. Но запрещающего его удаление или изменение. А ещё требующей обязательной инициализации при создании. 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 спорен, ох, как спорен. Нужен ли оператор взятия адреса? Арифметику, доступ по индексу, оператор вызова, и прочие умности, ясное дело в топку. |