我一直在使用我编写的一个类(这是一个有效的缩减版本),它提供了一种从字符串加载和保存任何变量的方法,并且可以添加到类中,前提是类中有这个对象并且它称为_settings_loader。每个变量通过#define ADD_PARAMETER(x) _settings_loader.AddParameter(#x, x); 添加。宏。
如果有人可以建议一种更简单的方法来扩展它而不是为每种类型使用每个单独的案例,我会喜欢它?我知道 C++ 是类型定义的,但我之前尝试做的事情(我不想在添加每个变量时使用模板)。
标题
#pragma once
#include <boost/any.hpp>
#include <map>
#include <string>
#include <iostream>
#include <vector>
#define ADD_PARAMETER(x) _settings_loader.AddParameter(#x, x);
class SettingsLoader
{
public:
SettingsLoader();
template <class T> void AddParameter(std::string name, T & parameter);
void SetParameter(std::string name, std::string value);
std::string GetParameterValue(std::string name);
void PrintOutParameters();
std::vector<std::pair<std::string, std::string> > GetAllParametersAsStrings();
protected:
std::map<std::string, boost::any> _parameters;
bool _debug;
};
template <class T> void SettingsLoader::AddParameter(std::string name, T & parameter)
{
_parameters.insert(std::make_pair(name, boost::any(¶meter)));
if (_debug)
{
std::cout << "Added parameter " << name << std::endl;
}
}
CPP
#include "settingsloader.h"
#include <boost/lexical_cast.hpp>
SettingsLoader::SettingsLoader():
_parameters(),
_debug(false)
{
}
void SettingsLoader::SetParameter(std::string name, std::string value)
{
try
{
std::map<std::string, boost::any>::iterator itterator = _parameters.find(name);
if (itterator != _parameters.end())
{
boost::any boost_any = itterator->second;
if (boost::any_cast<double*>(boost_any))
{
double * value_to_set = boost::any_cast<double*>(boost_any);
*value_to_set = boost::lexical_cast<double>(value);
}
else if (boost::any_cast<int*>(boost_any))
{
int * value_to_set = boost::any_cast<int*>(boost_any);
*value_to_set = boost::lexical_cast<int>(value);
}
else if (boost::any_cast<long*>(boost_any))
{
long * value_to_set = boost::any_cast<long*>(boost_any);
*value_to_set = boost::lexical_cast<long>(value);
}
}
else
{
if (_debug)
{
std::cout << "Parameter " << name << " could not be set" << std::endl;
}
}
}
catch(...)
{
}
}
std::string SettingsLoader::GetParameterValue(std::string name)
{
try
{
std::map<std::string, boost::any>::iterator itterator = _parameters.find(name);
if (itterator != _parameters.end())
{
boost::any boost_any = itterator->second;
if (boost::any_cast<double*>(boost_any))
{
double * value_to_get = boost::any_cast<double*>(boost_any);
return boost::lexical_cast<std::string>(*value_to_get);
}
if (boost::any_cast<int*>(boost_any))
{
int * value_to_get = boost::any_cast<int*>(boost_any);
return boost::lexical_cast<std::string>(*value_to_get);
}
if (boost::any_cast<long*>(boost_any))
{
long * value_to_get = boost::any_cast<long*>(boost_any);
return boost::lexical_cast<std::string>(*value_to_get);
}
}
}
catch(...)
{
}
return "";
}
std::vector<std::pair<std::string, std::string> > SettingsLoader::GetAllParametersAsStrings()
{
std::vector<std::pair<std::string, std::string>> output_vector;
for (auto pair : _parameters)
{
output_vector.push_back(std::make_pair(pair.first, GetParameterValue(pair.first)));
}
return output_vector;
}
void SettingsLoader::PrintOutParameters()
{
std::cout << "+=======================+" << std::endl
<< "|Printing out parameters|" << std::endl
<< "+=======================+" << std::endl;
std::vector<std::pair<std::string, std::string>> names_and_values = GetAllParametersAsStrings();
for (std::pair<std::string, std::string> pair : names_and_values)
{
std::cout << pair.first << " = " << pair.second << std::endl;
}
}