簡體   English   中英

C ++ POCO命令行處理

[英]C++ POCO command line processing

我正在嘗試使用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)

在不使用命令行參數的情況下運行它可以按預期工作:

$ ./最小
我們現在處於主要狀態。 選項是默認選項

使用命令行參數運行它,表明該選項已設置。 但是,從main()獲取選項后,它將被重置為默認值。

$ ./最小--optionval = mystring

將選項optionval設置為mystring

現在該選項為mystring

我們現在處於主要狀態。 選項是默認選項

就像我說的那樣,我期望變量作用域在這里的某個地方殺死我。 但是,我已經嘗試過諸如

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

產生相同的結果。

POCO的文檔相對廣泛。 github上的源代碼中有一些示例,但是似乎缺少了這一點。

有人可以啟發我嗎?

答案似乎很簡單。

顯然,僅當在initialize()中完成config()。setString()調用時,才會出現該錯誤。

通過將調用移到defineOptions(),默認值將按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM