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);
};
}
};
};
Запутанная декларация.
Имеется 3 структуры, которые могут быть элементами листа или вектора:
Код:
Структуры Compare созданы для того, чтобы быть третьим параметром в STL <algorythm> у функции find_if (т.е. это предикат).
Однако это не собирается по понятным причинам: компилятор жалуется, что вызываемые параметры (group_id, user_id) еще не определены.
Как следует правильно описать эти структуры, чтобы все работало корректно?
Возможно есть какой-то стандартный, но принципиально иной подход к использованию find_if?
Заранее благодарю.
Код:
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);
};
}
{
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