C++ POCO命令行处理

C++ POCO command line processing

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

但是,在解析命令行参数时,我一直坚持使用这个配置部分。这个问题似乎与可变范围有关。如果我使用回调函数并在 this->config() 对象中设置参数,则该值不会“固定”。一旦它 returns 到 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
We are now in main. Option is defaultoption

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

$ ./Minimal --optionval=mystring

Setting option optionval to mystring

The option is now mystring

We are now in main. Option is defaultoption

正如我所说,我预计变量范围会在这里某处杀死我。但是,我已经尝试过

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

产生相同的结果。

POCO 的文档相对丰富。 github 上的源代码中有示例,但似乎缺少此特定内容。

谁能赐教一下?

答案似乎很简单。

显然,错误仅在 config().setString() 调用在 initialize() 中完成时出现。

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