【发布时间】:2016-07-23 03:52:16
【问题描述】:
我有一个 std::map 变量,它包含一个 std::string 作为它的第一个参数和一个结构作为它的第二个参数。
struct entry {
std::string state; // works like an url eg. "/login" shows login
std::string description; // menu entry description eg. "login here"
int minAuth; // maximum user authorization level
int maxAuth; // minimum user authorization level
void (*fptr)(); //function to be called on match
bool active = false; // true if this is one of the options displayed
};
std::map<std::string, entry> entries;
我需要检查的是第一个参数值和第二个值(entry.active),以便正确显示菜单条目。 我使用 active 属性来确保如果有其他条目具有相同的 std::string(这是启动函数 entry.fptr 的命令),它们将不会具有相同的活动状态。
entry.active 属性的解释:
例如。想象两个不同的页面;用户面板和视图图像。这两个 有一个名为“下载”的命令,但是它们都有不同的 职能。一个下载用户日志,另一个下载一个 图片。 (这只是一个例子)。
我希望有一个比较函数来检查第一个参数是否匹配给定的输入,并且 entry.active 是否为真。
我想要完成的是类似于下面的代码。这不是功能代码,只是为了说明我希望 compare() 参数如何工作。检查输入是否与键相似,如果映射条目的 value.active 为 true,我希望 comp() 返回 true。
bool comp (const std::string a, const std::string b) const
{
return (a == b && this.second.active);
}
再次,有些人抱怨这段代码,所以让我这样说:那是伪代码,不是真正的代码。
我处理这个问题的第二种方法是为所有当前活动的菜单条目提供一个临时的 std::map,但我希望我不需要添加额外的 std::map 列表。 comp() 会干净得多。
粘贴码:http://pastebin.com/1uj40Fw8
有什么建议吗? ^^,
解决方案
添加一个额外的地图持有者:
std::map<std::string, entry> entries, activeEntries;
待显示的地图条目被程序规则批准后,将其添加到activeEntries地图中:
activeEntries.insert(i);
然后在 activeEntries 映射上使用 std::map::find 在整个菜单中找到正确的用户选择。对于较大的菜单也更有效。
【问题讨论】:
-
this之后的点不是 C++。comp是什么类的成员,它是如何被调用的?为什么你通过const值而不是引用传递a和b? -
我不知道如何实现 comp() 函数,所以这并不是一个真正的建议,而是一种向你们展示我正在寻找的东西的方式。无论如何,出于我的好奇心,使用 this->entry.active 是否正确?
-
this->可以完全省略,它仅用于消歧和different name lookup in derived class templates。 -
不确定您要做什么。
-
看我写的代码示例。类似的东西。