我正在嘗試使用Poco :: Util :: Application創建一個小應用程序,因爲它爲您提供了一些諸如配置和記錄器之類的功能。它也給你的一個東西是一個config()成員,它返回一個LayeredConfiguration對象。根據文檔,您可以使用諸如setString和getString之類的方法。C++ POCO命令行處理
但是,我在解析命令行參數時遇到了使用此配置部分的問題。這個問題似乎與變量範圍有關。如果我使用回調函數並在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
我們現在正處於主。選項爲default選項
使用命令行參數運行它,顯示選項已設置。但是,從main()獲得選項後,它將被重置爲默認值。
$ ./Minimal --optionval = MyString的
設置選項optionval到MyString的
的選項現在的MyString
現在我們是在主。選項是默認選項
正如我所說,我期待變量的範圍正在這裏殺死我的某處。但是,我已經嘗試了各種變體,例如
Poco::Util::Application &application = Poco::Util::Application::instance();
std::cout << application.config().getString("optionval");
其產生相同的結果。
POCO的文檔相對廣泛。在github上的源代碼中有一些例子,但這個特殊的東西似乎缺少。
有人可以啓發我嗎?