如何将对象字段作为函数参数传递(特征向量)

时间:2014-10-17 13:49:50

标签: c++

我想编写一个函数,我将两个对象及其字段数组作为参数传递,以计算相似度。

假设我有两个对象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
}

我希望你能理解我想说的话。

编辑:重点是创建一个可以比较两个对象的任意文件的函数。例如,当聚类时。我希望能够告诉函数要考虑哪些字段。

2 个答案:

答案 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

live demo

但是,哎呀!很难找到需要指向成员的指针。也许你找到了一个很好的理由。请务必记录您的需求和代码。另请注意,您希望以这种方式使用的所有成员必须具有相同的类型(此处为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;
}

你想要传递这些数组。

如果他们所有相同的类型,你需要更多参与的方式,模板风格的类型擦除。