以“通用”方式设置成员属性

时间:2011-02-14 15:58:56

标签: c++ generics member gsoap

是否可以以“通用”方式设置成员属性? 我还是c ++的新手,只是潜入模板,如果这是要走的路?

我必须使用的类有大约20个字符串成员从informix数据库填充,我可以使用字段(=属性)名称循环遍历数组。

假设我有一个简单的类

class Foo
{
  public:
    attr1
    attr2
  Foo() { };
  ~Foo();
}

我可以这样使用它:

Foo foo;

string myattr = "attr1";
string myval = "val x1";
string myval = "val x2";

setattribute( foo, myattr, myval1 );   // pseudocode... possible somehow?
cout << foo.attr1;     // prints "val x1"

setattribute( foo, myattr, myval2 );   // pseudocode... possible somehow?
cout << foo.attr1;     // prints "val x2"

我在循环中调用的方法看起来像这样......

// its_ref : empty string reference
// row: ptr on the current db row = query result object
// colname:  the db column = attribute
// ki: the object 

void get_fd( ITString & its_ref, ITRow * row, ITString colname, ns4__SOAPKunde& ki ) {
        ITConversions *c;
        ITValue *v = row->Column( colname );
        v->QueryInterface(ITConversionsIID, (void **) &c);
        c->ConvertTo( its_ref );
        // here is the place i want to use it :
        setattribute( ki, colname, its_ref.Data() );
}

3 个答案:

答案 0 :(得分:2)

您可以使用成员数据指针。这些可以是任何类型 - 例如

struct x {
    int y;
    int z;
};

int main() {
    int x::* res = &x::y;
}

但是,如果您想在运行时通过标识符开始访问它们,则必须从头开始构建自己的系统。

答案 1 :(得分:1)

我能想到的唯一选择是将您的属性存储在boost::any的地图中。假设您希望属性是异构类型。

基本思想是用地图替换Foo中的属性。因此,不是拥有所有私有属性,而是拥有包装它们的地图。 C ++的问题在于编译程序后属性名称不存在(与python等其他脚本语言不同)。因此,如果不使用某种数据结构,就无法从表示其名称的字符串中访问属性变量

删除旧编辑 _

答案 2 :(得分:0)

你可以使用std :: map。 然后,'ki'的(基类)类必须像这样实现setattribute:

// Member variable of MyClass
std::map<string, string> mProps;

void MyClass::setattribute( const char * name, const char * value )
{
  mProps[name] = value;
}