Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> адрес поля структуры в структуре 
V
    Опции темы
borisbn
Дата 25.1.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Здравствуйте.

У меня есть такой функтор
Код

template< class T, class FieldType, FieldType T::*FieldPtr >
struct EqualBy
{
    EqualBy( const FieldType & value ) : m_fieldValue( value ) {}
    bool operator()( const T & r ) const {
        return m_fieldValue == r.*FieldPtr;
    }
    bool operator()( const T * p ) const {
        return m_fieldValue == p->*FieldPtr;
    }
private:
    const FieldType m_fieldValue;
};

я его успешно использую для поиска в контейнерах, состоящих из структур
Код

struct A { int x; };
std::vector< A > v;
typedef EqualBy< A, int, &A::x > EqualByX;
std::vector< A >::iterator found = std::find_if( v.begin(), v.end(),  EqualByX( 42 ) );

http://liveworkspace.org/code/3f8197f05bae...d16944cff3303b7

Возникла задача искать в чуть более сложной структуре:
Код

struct A { int x; };
struct B { A a; };
std::vector< B > v;
typedef EqualBy< B, int, /* Вот тут не пойму что писать */ > EqualByX;

http://liveworkspace.org/code/fdb9f3e12a52...1a6dc083f333b7d

Вопрос:
1) Можно ли без переделки функтора это организовать ?
2) Если ответ на 1) положительный, то - как ?

Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 25.1.2012, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  25.1.2012,  15:20 Найти цитируемый пост)
 Можно ли без переделки функтора это организовать ?

нельзя..


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 25.1.2012, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



mes, спасибо. жаль. а есть что-нибудь подобное в boost'е, чтобы не городить для этого своего монстра ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Result
Дата 25.1.2012, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 15.5.2011

Репутация: 2
Всего: 5



может посмотреть в сторону traits...
PM   Вверх
mes
Дата 25.1.2012, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  25.1.2012,  16:18 Найти цитируемый пост)
 а есть что-нибудь подобное в boost'е, чтобы не городить для этого своего монстра ? 

bind, тогда и ваш функтор не нужен будет smile

Это сообщение отредактировал(а) mes - 25.1.2012, 17:27


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 25.1.2012, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Собственно, монстра понятно как делать
Код

template< class T, class FieldType, class U, U T::*S, FieldType U::*FieldPtr >
struct EqualBy
{
    EqualBy( const FieldType & value ) : m_fieldValue( value ) {}
    bool operator()( const T & r ) const {
        return m_fieldValue == r.*S.*FieldPtr;
    }
    bool operator()( const T * p ) const {
        return m_fieldValue == p->*S->*FieldPtr;
    }
private:
    const FieldType m_fieldValue;
};
typedef EqualBy< B, int, A, &B::a, &A::x > EqualByX;

http://liveworkspace.org/code/9475f7faa2e4...7ae5900fc45a915

но... ИМХО, это уж слишком...

Добавлено через 2 минуты и 21 секунду
mes, а не подскажете на моём примере, как при помощи bind это организовать ? А то как с "одномерной" структурой мне понятно, а с "двумерной" - не очень...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 25.1.2012, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вложенный бинд :
Код

  find_if  ( .. , ..  , boost::bind (&A::x, boost::bind(&B::a, _1)) == 42 );




--------------------
PM MAIL WWW   Вверх
borisbn
Дата 25.1.2012, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



mes, спасибо.
А можно ещё вопрос в догонку ?
этот оператор ==, который подставляется в find_if в качестве предиката, какой-то переопределённый boost'ом ?



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 25.1.2012, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  25.1.2012,  17:16 Найти цитируемый пост)
этот оператор ==, ... какой-то переопределённый boost'ом 

да, также как и бинд, возвращает binder от своих аргументов..

Добавлено через 2 минуты и 13 секунд
т.е. сравнение  будет происходить позже, в момен вызова биндера, а не в в момент его определения...

Добавлено через 4 минуты и 18 секунд
вместо == можно прибиндить тот же std::equal, но с оператором нагляднее..

Добавлено через 4 минуты и 49 секунд
в C++11 у бинда, насколько я знаю, эти операторы не переопределены.. 



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 25.1.2012, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Ясно. Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 25.1.2012, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  25.1.2012,  18:17 Найти цитируемый пост)
Ясно. Спасибо. 

http://forum.vingrad.ru/forum/topic-325459...bind/index.html
3й пост с конца  smile 


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 26.1.2012, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(mes @  25.1.2012,  19:24 Найти цитируемый пост)
http://forum.vingrad.ru/forum/topic-325459...bind/index.html
3й пост с конца

тему помню smile (ещё бы, сам спрашивал), но тогда, почему-то, не возникло вопроса про operator == 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Artemon
Дата 27.1.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



borisbn,  Интересный код, есть несколько вопросов:

что означает строка: 

typedef EqualBy< A, QString, &A::x > EqualByX;

И также не совсем ясно, какой адрес возвратится здесь &A::x, ведь объекта еще нет 


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
borisbn
Дата 27.1.2012, 10:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Artemon @  27.1.2012,  10:04 Найти цитируемый пост)
что означает строка: 

typedef EqualBy< A, QString, &A::x > EqualByX;

а откуда взялся QString ???
код значит следующее:
Имеется шаблонная структура с тремя параметрами шаблона: 1) тип структуры, с которой она работает, 2) тип поля в этой структуре, 3) адрес этого поля внутри структуры (можно сказать смещение, относительно начала).
Далее, даётся определение (typedef) для конкретной реализации этой шаблонной структуры, и этой конкретной реализации даётся новое имя - EqualByX. Этот EqualByX - это та же структура EqualBy, но не для всех случаев жизни, а для 1) A 2) int 3) &A::x

Цитата(Artemon @  27.1.2012,  10:04 Найти цитируемый пост)
И также не совсем ясно, какой адрес возвратится здесь &A::x, ведь объекта еще нет 

возвратится не адрес, а, грубо говоря, смещение внутри A. Затем в структуре EqualBy вычислится конкретный адрес

Цитата(borisbn @  25.1.2012,  16:20 Найти цитируемый пост)
r.*FieldPtr;

или
Цитата(borisbn @  25.1.2012,  16:20 Найти цитируемый пост)
p->*FieldPtr;




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Artemon
Дата 27.1.2012, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Цитата(borisbn @  27.1.2012,  10:14 Найти цитируемый пост)
а откуда взялся QString ???

Это я попробовал как од будет работать с типом QString.

За разъяснения спасибо, все понял.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1023 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.