[英]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.