1

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

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

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

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

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

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

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

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

这可能吗?我该怎么做?

4

1 回答 1

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;
}
于 2012-05-30T19:42:08.307 回答