我的意思是,我正在制作一个程序,该程序通过控制台从用户那里获取参数(尽可能多次输入),例如:
-p /users/me/myFolder/myHtmlFile.html -d /users/me/myOtherFolder -n myHmtlFileStyles -r
会设置参数-p
,-d
和-n
,然后运行程序(因为这是-r
的作用)。我已经编写了一个函数,它遍历输入字符串中由空格包围的每个子字符串。所以我怀疑n00b设计模式会像
if (this_substring == "-p")
{
// ... run some procedure
}
else if (this_substring == "-d")
{
// ... run some procedure
}
else if (this_substring == "-n")
{
// ... run some procedure
}
else if (this_substring == "-r")
{
// ... run some procedure
}
else
{
// ... trigger not recognized; throw an error
}
但我确信有更优雅和正确的方法。例如,有没有办法将string
映射到函数?是否存在类似
std::map<std::string, function> triggerMap = {{"-p", function1()}, {"-d", function2()}, "-n", function3()}, {"-r", function4()}};
??????
答案 0 :(得分:2)
您可以从字符串到函数对象构建std::unordered_map
,使用lambda初始化函数对象并根据其键调用它:
std::unordered_map<std::string, std::function<void()>> fns {
{
"-p",
[]() {
// do stuff
}
},
{
"-d",
[]() {
// do something else
}
}
};
fns[param]();
答案 1 :(得分:0)
这取决于您遵循的标准。我强烈建议您使用C++11(例如,使用最新的GCC 4.9编译器,使用-std=c++11
)。然后使用std::function和anonymous lambdas closures。
顺便说一句,您可以使用(如果在Linux上)glibc
parsing program arguments设施。
答案 2 :(得分:0)
当然,您可以使用函数指针。 但我建议你只使用getopt
请参阅:http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
在你的情况下:
while ((c = getopt (argc, argv, "p:d:n:r:")) != -1)
{
switch (c)
{
case 'p':
function(optarg);
break;
case 'd':
function(optarg);
break;
case 'n':
function(optarg);
break;
case 'r':
function(optarg);
break;
}
}
答案 3 :(得分:-1)
使用开关和一堆案例。识别标志(-r,-n等),提取字符并将其用作案例标签。也许不像优雅的lambda闭包那样优雅,但更通用的是C ++。