将对象映射到函数的正确C ++方法是什么?

时间:2014-11-16 17:24:03

标签: c++

我的意思是,我正在制作一个程序,该程序通过控制台从用户那里获取参数(尽可能多次输入),例如:

-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()}};

??????

4 个答案:

答案 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::functionanonymous 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 ++。