我正在尝试使用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上的源代码中有一些例子,但这个特殊的东西似乎缺少。
有人可以启发我吗?