【问题标题】:set a member attribute in a "generic" way以“通用”方式设置成员属性
【发布时间】:2011-02-14 15:58:56
【问题描述】:

是否可以以“通用”方式设置成员属性? 我还是 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() );
}

【问题讨论】:

  • 你可以这样做。你只需要一个代码生成器来为你生成反射。

标签: c++ generics member gsoap


【解决方案1】:

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

struct x {
    int y;
    int z;
};

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

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

【讨论】:

  • +1 对于不同的解决方案。这可以很容易地扩展到运行时...std::map&lt; std::string, int x::* &gt; 可用于将任何字符串映射到任何成员(int 类型),然后在引入数据时可以将其设置为:obj.*attributes[name] = value; 虽然不是最好的解决方案。 ..
  • 因此,如果我的 x 类型对象具有属性 obj.z = 3;,我需要通过 cout &lt;&lt; obj.*attributes["z"]; 访问它,这不起作用。你能进一步解释一下吗?
  • 好的,同样来自here 我需要先attributes["z"]=&amp;x::z;
【解决方案2】:

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

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

删除旧编辑_

【讨论】:

  • 我读过它,很好。但是您不想更改 SOAPKunde 类的实现,即 ki 对象?我对此没有影响。还是我误会了?
【解决方案3】:

您可以使用 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;
} 

【讨论】:

  • 这不是他说的。
  • @Nawaz:为什么这么肯定?我认为他对 C++ 很陌生,并且非常模糊地告诉了他想要什么(例如,潜入模板,foo = Foo(); ???)。你知道的那么准确吗?
  • 没错,我有一个对象,想设置成员属性,这里不能用地图。 - 感谢 Valentin 指出我的 foo 初始化错误,我在上面更新了。 (我习惯用python知道...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2017-08-05
  • 1970-01-01
  • 2021-12-01
  • 2021-11-29
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多