Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запутанная декларация.

1.8K
05 декабря 2011 года
Arkady
153 / / 18.12.2007
Доброго времени суток,

Имеется 3 структуры, которые могут быть элементами листа или вектора:

Код:
struct S_UserGroup;
struct S_Group;
struct S_User;

struct S_Group
{
    string group_id;
    struct Compare
    {
        string field;
        enum _type {group, user_group} type;

        Compare(const S_Group& g)
        {
            field = g.group_id; type = group;
        }
        Compare(const S_UserGroup& ug)
        {
            field = ug.group_id; type = user_group;
        }
        bool operator()(const S_Group& g)
        {
            switch(type)
            {
                case group: return g.group_id == field);
                case user_group: return (g.group_id == field);
            };
        }
    };
};

struct S_User
{
    string    user_id;
    struct Compare
    {
        string field;
        enum _type {user, user_group} type;

        Compare(const S_User& usr)
        {
            field = usr.user_id; type = user;
        }
        Compare(const S_UserGroup& ug)
        {
            field = ug.user_id; type = user_group;
        }
        bool operator()(const S_User& usr)
        {
            switch(type)
            {
                case user: return (usr.user_id == field);
                case user_group: return (usr.user_id == field);
            };
        }
    };
};

struct S_UserGroup
{
    string user_group_id;
    string group_id;
    string user_id;
   
    struct Compare
    {
        string field;
        enum _type {group, user, user_group} type;

        Compare(const S_Group& g)
        {
            field = g.group_id; type = group;
        }
        Compare(const S_User& usr)
        {
            field = usr.user_id; type = user;
        }
        Compare(const S_UserGroup& ug)
        {
            field = ug.user_group_id; type = user_group;
        }
        bool operator()(const S_UserGroup& ug)
        {
            switch(type)
            {
                case group: return (ug.group_id == field);
                case user: return (ug.user_id == field);
                case user_group: return (ug.user_group_id == field);
            };
        }
    };
};


Структуры Compare созданы для того, чтобы быть третьим параметром в STL <algorythm> у функции find_if (т.е. это предикат).

Однако это не собирается по понятным причинам: компилятор жалуется, что вызываемые параметры (group_id, user_id) еще не определены.
Как следует правильно описать эти структуры, чтобы все работало корректно?

Возможно есть какой-то стандартный, но принципиально иной подход к использованию find_if?

Заранее благодарю.
360
06 декабря 2011 года
P*t*
474 / / 15.02.2007
Попробуйте что-нибудь вроде этого:

Код:
struct S_Group
{
    string group_id;
    struct Compare
    {
        string field;
        enum _type {group, user_group} type;
        Compare(const S_Group& g);
        Compare(const S_UserGroup& ug);
        operator()(const S_Group& g);
    };
};

S_Group::Compare::Compare(const S_Group& g) {
        field = g.group_id; type = group;
}
S_Group::Compare::Compare(const S_UserGroup& ug) {
        field = ug.group_id; type = user_group;
}
bool S_Group::Compare::operator()(const S_Group& g)
        {
            switch(type)
            {
                case group: return g.group_id == field);
                case user_group: return (g.group_id == field);
            };
        }


Можно также полностью вынести реализацию Compare из S_Group
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог