C++ C++;-使用boost::property_树从.ini文件初始化静态常量变量
对于读取INI配置文件C++ C++;-使用boost::property_树从.ini文件初始化静态常量变量,c++,boost,static,constants,boost-propertytree,C++,Boost,Static,Constants,Boost Propertytree,对于读取INI配置文件boost:property_tree,可按如下方式使用: #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/ini_parser.hpp> int main() boost::property_tree::ptree pt; boost::property_tree::ini_parser::read_ini("config.ini", p
boost:property_tree
,可按如下方式使用:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
int main()
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("config.ini", pt);
int N = pt.get<int>("Section.ValueOfN");
但是如果我想从配置文件加载它呢N
是静态变量,因此必须在任何函数中定义它。另一方面,我必须在函数内部定义property\u tree
,但如果它在函数内部,我就不能用它来定义静态常量变量
如果是这样的话:
//Class.hpp
class Class
{
static const int N;
}
//Class.cpp
const int Class::N = 42;
//Class.hpp
class Class
{
static const int N;
}
//Class.cpp
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("config.ini", pt);
const int Class::N = pt.get<int>("Section.ValuOfN");
//Class.hpp
class Class
{
static const int N;
}
//Class.cpp
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
namespace {
int getFromINI(const std::string& section, const std::string& value)
{
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("config.ini", pt);
return pt.get<int>(section + "." + value);
}
}
// Define constant static variables
const int Class::N = getFromINI("Section","ValueOfN");
我可以这样解决:
//Class.hpp
class Class
{
static const int N;
}
//Class.cpp
const int Class::N = 42;
//Class.hpp
class Class
{
static const int N;
}
//Class.cpp
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("config.ini", pt);
const int Class::N = pt.get<int>("Section.ValuOfN");
//Class.hpp
class Class
{
static const int N;
}
//Class.cpp
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
namespace {
int getFromINI(const std::string& section, const std::string& value)
{
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("config.ini", pt);
return pt.get<int>(section + "." + value);
}
}
// Define constant static variables
const int Class::N = getFromINI("Section","ValueOfN");
//Class.hpp
班级
{
静态常数;
}
//Class.cpp
#包括
#包括
名称空间{
int getFromINI(常量std::string和section,常量std::string和value)
{
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini(“config.ini”,pt);
返回pt.get(段+“+”值);
}
}
//定义常量静态变量
const int Class::N=getFromINI(“Section”、“ValueOfN”);
正如你所看到的,这不是一个理想的解决方案。我必须为我要定义的每个静态常量变量创建一个属性树
,该树只使用一次。当然,我必须改进getFromINI
函数,以便能够读取int以外的其他类型
有什么建议吗?首先,是的,这是您能做的最好的(使用匿名lambda以获得额外的简洁性)。另外:不要使全局为静态。当你说“为我要定义的每个静态常量变量建立一个属性树”时,谢谢我们。你有很多变量和实例吗?我想知道是否有另一种方式来看待设计,而不是解决特定的问题——也许只是制作一个全局文件,读取整个INI部分,将单个值作为成员公开。