【问题标题】:Is it possible to make a function to compare dynamically selected variables from a vector of objects?是否可以创建一个函数来比较对象向量中动态选择的变量?
【发布时间】:2016-01-13 12:55:58
【问题描述】:

我经常遇到我希望能够创建一个函数来完成类似任务的情况。

编辑:

心中的任务是比较对象之间的成员变量。如果有一种方法可以编写一个函数,允许您将对象作为参数,并将特定的成员变量作为另一个参数进行比较,那就太好了。这将需要某种方式来表示或识别我想在每次调用函数时比较的特定成员变量。

这是一个示例类和对象来说明我的意思:

class MyObject {
  int var1;
  int var2;
  int var3;

  // Unwritten constructor that sets all member variables in order
};

MyObject obj1 (1, 2, 3);
MyObject obj2 (4, 3, 2);

下面是一组类似函数的示例,如果可以合并为一个函数,可以动态选择使用哪个成员变量:

int compareMemberVar1 (MyObject obj1, MyObject obj2) {

  return max(obj1.var1, obj2.var1);
}

int compareMemberVar2 (MyObject obj1, MyObject obj2) {

  return max(obj1.var2, obj2.var2);
}

int compareMemberVar3 (MyObject obj1, MyObject obj2) {

  return max(obj1.var3, obj2.var3);
}

这些显然会像这样使用:

int var1max = compareMemberVar1 (obj1, obj2);
int var2max = compareMemberVar2 (obj1, obj2);
int var3max = compareMemberVar2 (obj1, obj2);

这是我希望能够编写来替换上述 3 的那种函数:

int compareAnyMemberVar (MyObject obj1, MyObject obj2, /*representation of memberVar*/) {

  return max(obj1./*memberVar*/, obj2./*memberVar*/);
}

以及对应的mock用法:

int var1max = compareAnyMemberVar (obj1, obj2, /*representation of Var1*/);
int var2max = compareAnyMemberVar (obj1, obj2, /*representation of Var2*/);
int var3max = compareAnyMemberVar (obj1, obj2, /*representation of Var3*/);

编辑:

在上面,我试图在每次调用时使用相同的函数来比较不同的成员变量。因此 /VarX 的表示/ 部分将是表示或标识我这次要访问的成员变量的某种方式。

这可能吗?如何?提前感谢您提供的任何帮助,

皮特

【问题讨论】:

  • 您在寻找函数指针吗?我最终不确定你想要达到什么目标。
  • 我明白为什么我的问题令人困惑。我想对我所追求的更简单的解释是,一种表示/识别对象成员变量的方法。然后可以将该表示或标识传递给函数或以其他方式访问该时间所需的特定成员变量。我将编辑我的问题并尝试使其更清晰
  • 还有成员变量指针可用。

标签: c++ function object compare member


【解决方案1】:

你可以使用成员指针:

template<typename T>
int compareAnyMemberVar(MyObject obj1, MyObject obj2, T MyObject::* member) {
    return max(obj1.*member, obj2.*member);
}

int var1max = compareAnyMemberVar(obj1, obj2, &MyObject::var1);
int var2max = compareAnyMemberVar(obj1, obj2, &MyObject::var2);
int var3max = compareAnyMemberVar(obj1, obj2, &MyObject::var3);

进一步概括:

template<typename T, class C>
int compareAnyMemberVar(C const& obj1, C const& obj2, T C::* member) {
    return max(obj1.*member, obj2.*member);
}

【讨论】:

  • @molbdnio 给出了非常相似的答案,但没有他的模板位,使用模板有什么特别的好处吗?
  • @IronAttorney 只是更笼统。例如,如果你添加了一个字符串成员,这个函数仍然可以工作。
  • 啊!好吧,这也涵盖了我的下一个想法。惊人的!我想我可以通过为对象制作模板或其他东西来进一步扩展它吗?这样我就可以创建一个函数来比较任何对象的任何成员变量
  • @IronAttorney 我不明白。您的意思是将template&lt;typename T&gt; 更改为template&lt;typename T, class C&gt; 并将T MyObject::* member 更改为T C::*member?是的,这会奏效。
  • 是的!这就是我的意思。你真棒!是时候了解模板了:D 感谢以上所有信息!
【解决方案2】:

您可以使用“指向成员的指针”。

指向MyObjectint 成员的指针的类型为int MyObject::*
MyObject::* 表示“指向MyObject 成员的指针”。
(它不是一个“普通”指针,因为它没有指定内存中的绝对位置,但这不是重点。书籍和互联网上都有大量的阅读材料。)

您可以像这样使用“address-of”运算符创建它们:

int MyObject::* mvar1 = &MyObject::var1;
int MyObject::* mvar2 = &MyObject::var2;

要取消引用它们,您可以使用 .* 运算符:

MyObject obj1 = ...
MyObject obj2 = ...
if (obj1.*mvar1 == obj2.*mvar2)
    // ...

int compareAnyMemberVar (MyObject obj1, MyObject obj2, int MyObject::* member) {

  return max(obj1.*member, obj2.*member);
}

// ...
int x = compareAnyMemberVar(obj1, obj2, &MyObject::var3);

如果你有一个指向对象的指针,你可以使用更有趣的-&gt;* 操作符来取消引用。

MyObject* op = ...
int v = op->*mvar2;

【讨论】:

  • 你也可以使用成员引用吗?
  • @IronAttorney 没有成员引用(即 int MyObject::&amp; 是不允许的)。
  • 公平竞争,我想这种指针的使用可能并没有那么危险
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2021-03-09
  • 1970-01-01
相关资源
最近更新 更多