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

Iro*_*ney 1 c++ compare function object member

我一直在进入我希望能够制作单一功能以涵盖类似任务的情况.

编辑:

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

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

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);
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

这些可以像这样使用:

int var1max = compareMemberVar1 (obj1, obj2);
int var2max = compareMemberVar2 (obj1, obj2);
int var3max = compareMemberVar2 (obj1, obj2);
Run Code Online (Sandbox Code Playgroud)

以下是我希望能够编写以替换上述3的函数:

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

  return max(obj1./*memberVar*/, obj2./*memberVar*/);
}
Run Code Online (Sandbox Code Playgroud)

它是相应的模拟用法:

int var1max = compareAnyMemberVar (obj1, obj2, /*representation of Var1*/);
int var2max = compareAnyMemberVar (obj1, obj2, /*representation of Var2*/);
int var3max = compareAnyMemberVar (obj1, obj2, /*representation of Var3*/);
Run Code Online (Sandbox Code Playgroud)

编辑:

在上面,我试图使用相同的函数来比较每个调用上的不同成员变量.因此,VarX/part 的/ 表示将是表示或识别我想要访问的成员变量的某种方式.

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

皮特

Sim*_*ple 5

您可以使用成员指针:

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);
Run Code Online (Sandbox Code Playgroud)

进一步概括:

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