Доступ к вложенной паре - PullRequest
       32

Доступ к вложенной паре

0 голосов
/ 22 сентября 2009

Чтобы разобрать пару, можно сделать следующее

boost::bind(&std::pair::second, _1); // returns the value of a pair

Как насчет использования комбинаций различных контейнеров, как получить доступ к вложенной паре?

Например, когда я хотел разделить вектор на элементы, содержащиеся в дополнительной карте, и элементы, которые не были включены в дополнительную карту, я использовал следующее:

typedef int DWORD; typedef std::pair<std::string, bool> user_info; 
typedef std::map<DWORD, user_info> USER_MAP; 
typedef std::vector<DWORD> VEC_STAFF; 
VEC_STAFF::iterator it = std::partition(
   Staff.begin(), Staff.end(), 
  (bind(&USER_MAP::find, m_Users, _1) != m_Users.end()));

Теперь у меня есть вторая проблема - во время работы приложения состояние bool для user_info может измениться, и позже я хочу переразбить вектор на элементы, которые имеют статус bool true, а не просто содержатся дополнительная карта.

Однако, похоже, у меня проблема с доступом ко второму элементу вложенной пары.

Я попробовал следующее, но не могу получить доступ к вложенной паре!

VEC_STAFF::const_iterator itCurEnd = partition(Staff.begin(), Staff.end(),
     bind(&USER_MAP::value_type::second::second, 
     bind(&USER_MAP::find, &m_Users, _1)) == true);

Ответы [ 2 ]

4 голосов
/ 22 сентября 2009

Не уверен, что слежу за тем, что там происходит, но обычно, когда у меня возникают проблемы с связыванием, я сдаюсь и реализую функтор. Это может упростить вещи в вашем случае.

Для меня следующее намного легче читать, чем все, что возиться с несколькими уровнями связывания

template <class Arg>
struct Whatever : public std::unary_function<Arg, bool>
{
    bool operator()(const Arg &arg1) const {
        //logic here
    } 
};

Whatever<???> functor;
std::partition(Staff.begin(), Staff.end(), functor);
1 голос
/ 22 сентября 2009

Синтаксис, который вы использовали, очевидно, не работает. Первый «:: second» уже означает нестатический член, а не тип. Если у вас есть пара внутри пары, вам, вероятно, придется использовать два вызова связывания:

typedef std::pair< int, bool > foo_t;
typedef std::pair< int, foo_t > bar_t;
.....

bind( &foo_t::second, bind(&bar_t::second,
    bind( &USER_MAP::find, _1 )
) )

(я не проверял это. Возможно, это то, что вы хотите)

Но три уровня, если связывание довольно сложное, на мой взгляд.

Редактировать: Как насчет этого?

template<typename Iter, typename Return>
struct deref_2nd_2nd : std::unary_function<Iter, Return> {
    Return operator()(Iter const& it) const {
        return (*it).second.second;
    }
};

.....

bind(
    deref_2nd_2nd<USER_MAP::iterator,bool>(),
    bind( &USER_MAP::find, _1 )
)
...