C++ C++;-使用boost::property_树从.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

对于读取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", 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部分,将单个值作为成员公开。