是否可以创建一个函数来比较从对象向量中动态选择的变量?

Is it possible to make a function to compare dynamically selected variables from a vector of objects?

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

编辑:

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

这里有一个例子 class 和对象来说明我的意思:

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/ 的 / 表示部分将是某种表示或标识我这次要访问的成员变量的方式。

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

皮特

您可以使用 "pointer-to-member".

指向 MyObjectint 成员的指针具有 int MyObject::*.
类型 MyObject::* 表示 "pointer to a member of MyObject".
(它不是 "normal" 指针,因为它不指定内存中的绝对位置,但这不是重点。在书籍和互联网上都有大量阅读 material。)

您可以像这样使用 "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);

如果你有一个指向对象的指针,你可以使用更有趣的 ->* 运算符取消引用。

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

您可以使用成员指针:

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);
}