C ++ POCO命令行处理

时间:2017-03-23 01:19:06

标签: c++ poco-libraries

我正在尝试使用Poco :: Util :: Application创建一个小应用程序,因为它提供了一些东西,例如配置和记录器,就在门外。它还为您提供的一个东西是config()成员,它返回一个LayeredConfiguration对象。根据文档,您可以使用setString和getString等方法。

但是,在解析命令行参数时,我仍然坚持使用此配置部分。问题似乎与变量范围有关。如果我使用回调函数并在this-> config()对象中设置参数,则该值不会“粘住”。一旦返回main(),该值将重置为默认值。

以下是一个最小的例子:

#include <Poco/Util/Application.h>

#include <Poco/Util/Option.h>
#include <Poco/Util/OptionSet.h>
#include <Poco/Util/OptionCallback.h>

#include <iostream>

class OptionExample : public Poco::Util::Application
{
protected:
    void initialize(Poco::Util::Application& application){
        this->config().setString("optionval", "defaultoption");
        this->loadConfiguration();
        Poco::Util::Application::initialize(application);
    }

    void uninitialize(){
        Poco::Util::Application::uninitialize();
    }

    void defineOptions(Poco::Util::OptionSet& optionSet) {
        Poco::Util::Application::defineOptions(optionSet);

        optionSet.addOption(
                Poco::Util::Option("optionval", "", "Some value")
                        .required(false)
                        .repeatable(true)
                        .argument("<the value>", true)
                        .callback(Poco::Util::OptionCallback<OptionExample>(this, &OptionExample::handleMyOpt))
        );
    }

    void handleMyOpt(const std::string &name, const std::string &value) {
        std::cout << "Setting option " << name << " to " << value << std::endl;
        this->config().setString(name, value);
        std::cout << "The option is now " << this->config().getString(name) << std::endl;
    }

    int main(const std::vector<std::string> &arguments) {
        std::cout << "We are now in main. Option is " << this->config().getString("optionval") << std::endl;
    }
};

POCO_APP_MAIN(OptionExample)

在没有命令行参数的情况下运行它可以按预期工作:

  

$ ./Minimal
  我们现在是主要的。选项是defaultoption

使用命令行参数运行它会显示该选项已设置。但是,在从main()获取选项后,它将被重置为默认值。

  

$ ./Minimal --optionval = mystring

     

将选项optionval设置为mystring

     

该选项现在是mystring

     

我们现在处于主要阶段。选项是defaultoption

正如我所说,我期待变量范围在这里杀死我。但是,我已经尝试了诸如

之类的变体
Poco::Util::Application &application = Poco::Util::Application::instance();
std::cout << application.config().getString("optionval");

产生相同的结果。

POCO的文档相对广泛。在github上的源代码中有一些例子,但是这个特殊的东西似乎缺失了。

有人可以启发我吗?

1 个答案:

答案 0 :(得分:0)

答案似乎很容易。

显然,只有在initialize()中完成config()。setString()调用时才会出现错误。

通过将调用移动到defineOptions(),默认值按预期工作。