我想编写一个函数,我将两个对象及其字段数组作为参数传递,以计算相似度。
假设我有两个对象A和B,它们有A.size,A.weight,A.color,A.id等字段。
现在我想要一个带有这些参数的大小为2的函数,所以它看起来像这样:
double measureSim (Car a, Car b, ??? feature[2]){
double value = 0;
for(int i = 0; i < feature.size; i++){
double += (A.feature[i] - B.feature[i]);
}
return value
}
我希望你能理解我想说的话。
编辑:重点是创建一个可以比较两个对象的任意文件的函数。例如,当聚类时。我希望能够告诉函数要考虑哪些字段。
答案 0 :(得分:1)
如果您尝试传递某种&#34;对字段成员名称的引用&#34;数组并以这种方式迭代一个类,然后你就无法以这种方式完成它。您无法遍历某个类型的成员。
你可以传递一个指向成员的数组:
#include <iostream>
#include <vector>
// (all doubles for exposition)
struct Car
{
double size;
double weight;
double color;
double id;
};
typedef double Car::*ptrToCarMember;
double measureSim(const Car& a, const Car& b, std::vector<ptrToCarMember> feature)
{
double value = 0;
for (auto el : feature) {
value += a.*el - b.*el;
}
return value;
}
int main()
{
Car a = { 1.0, 2.0, 4.0, 8.0 };
Car b = { 1.0, 2.0, 3.0, 4.0 };
{
std::vector<ptrToCarMember> features{&Car::size};
std::cout << measureSim(a, b, features) << '\n';
}
{
std::vector<ptrToCarMember> features{&Car::id};
std::cout << measureSim(a, b, features) << '\n';
}
{
std::vector<ptrToCarMember> features{&Car::size, &Car::weight, &Car::color};
std::cout << measureSim(a, b, features) << '\n';
}
}
// $ g++ -std=c++11 -Wall main.cpp && ./a.out
// 0
// 4
// 1
但是,哎呀!很难找到需要指向成员的指针。也许你找到了一个很好的理由。请务必记录您的需求和代码。另请注意,您希望以这种方式使用的所有成员必须具有相同的类型(此处为double
);你不能混合搭配。
使用可变参数模板可能更具惯用性,但我不打算在这里讨论它,因为它是一个高级主题,可能有点过分。
您还可以看一下用std::map
替换您的成员变量,然后您可以使用地图的键和值做很多事情而不需要&#34;魔法&#34;
答案 1 :(得分:1)
假设您的所有字段属于同一类型(例如float
),那么您正在寻找指向成员的指针。语法如下:
// An example class with two fields to choose from
class A {
float f1;
float f2;
};
int main(int, char**) {
// Declaration of a pointer-to-member
float A::*ptr;
// Assignment, note that we don't have an instance yet
ptr = &A::f1;
// Creating an actual instance
A a;
// Using the pointer on the instance
a.*ptr = 3.14f;
// Check that it worked. It did !
std::cout << a.f1 << '\n';
return 0;
}
你想要传递这些数组。
如果他们不所有相同的类型,你需要更多参与的方式,模板风格的类型擦除。