1

私は、文字列から変数をロードおよび保存するためのメソッドを提供し、クラスにこのオブジェクトが含まれていて、それが_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(&parameter)));

  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;
  }
}
4

2 に答える 2

0

プロジェクトの範囲によっては、C++ 言語のインストゥルメントで問題を解決する代わりに、コード ジェネレーターの使用を開始することを検討する必要があります。あなたが説明したものよりもはるかに多くの問題を解決する非常に優れたプロジェクトがいくつかあります。

例: Google プロトコル バッファ、Apache thrifty、その他多数

于 2013-10-04T21:44:25.117 に答える