c ++从配置文件构建类属性

时间:2012-05-30 15:12:02

标签: c++

我已经使用具有硬编码属性的类实现了算法。

但是现在,我想为它增加一些灵活性。

假设我只使用了class Voice中可用的四个属性。可用,我的意思是我有他们的数据,存储在数据库中。

class Voice
{
    double price;                  // used this one.
    unsigned int duration;         // and this one.
    string destination;
    string operatorid;
}

我创建了一个向量,使得vector [0] [0] =第一个元素的价格,vector [0] [1] =第一个元素的持续时间,依此类推。

我希望用户编辑配置文件(我一直在使用SimpleIni.h),并按照他想要的顺序添加他想要的属性,例如:

[Voice]
attribute1 = operatorid
attribute2 = price
attribute3 = duration

Voice应仅使用这三个属性构建,以便vector [n]具有vector[n][0] = nth元素的operatorid值,vector[n][1] =值nth元素的价格,vector[n][2] = nth元素的持续时间值。

这可能吗?我该怎么办?

1 个答案:

答案 0 :(得分:0)

这让我想起了Python(只是一点点):

#include <string>
#include <map>
#include <iostream>

#include <boost/variant.hpp>
#include <boost/variant/get.hpp>
#include <boost/format.hpp>

class Foo
{
  typedef boost::variant<double, int, std::string> var;

  struct NoSuchAttributeError {
    NoSuchAttributeError(const std::string &key) {
      std::cout << boost::format("Attribute %s not found!\n") % key; 
    }
  };

  std::map<std::string, var> attributes;

  var& getattr(const std::string& key) {
    std::map<std::string, var>::iterator it = attributes.find(key);
    if (it == attributes.end()) {
      throw NoSuchAttributeError(key);
    }
    else {
      return (*it).second;
    }
  }

  template<typename T> 
  T& get(var& v) {
    return boost::get<T, double, int, std::string>(v);
  }

public:
  Foo() {
    // TODO: add attributes according to configuration file
    attributes["foo"] = 42;
    attributes["bar"] = "baz";
  }

  // TODO: add appropriate getters/setters for attributes
  int& foo() { return get<int>(attributes["foo"]); }
  std::string& bar() { return get<std::string>(attributes["bar"]); }
};

int main() {
  Foo f;
  std::cout << f.foo() << " " << f.bar() << std::endl;
  f.foo() = 13;
  f.bar() = "Hello World!";
  std::cout << f.foo() << " " << f.bar() << std::endl;
  return 0;
}