C++,将结构特征作为参数传递给函数

New*_*Guy 5 c++ parameters struct

首先,我想说这是我在stackOverflow上问的第一个问题,所以如果我不够清楚,我深表歉意。

我的问题是关于以参数方式引用函数内的结构特征。我在 C++ 中工作。

我真正想要实现的是能够根据作为参数给出的特定结构特征对结构对象(或类对象)的向量进行排序。 我还想通过模板提供结构的类型,因此一些处理特定情况的解决方法通常可能不起作用。

我将展示一个简单的例子来说明我的意思。

比方说,我有一个名为“human”的结构,具有以下特征:“年龄”、“身高”、“体重”。

我们还假设我有一个称为“人类”的“人类”对象向量。

在这里,假设我想创建一个函数,根据我作为参数传递的内容,可以将每个元素的年龄、高度或体重输出到屏幕上。

下面的代码显然不起作用。我要求正确的方法来做到这一点。

struct human{
    int age;
    int height;
    int weight;
};

void show(vector<human> &elements, int value){
    for (int i=0; i<elements.size(); i++)
        cout << elements[i].value << endl;
}

int main{
    ...
    vector<human> mankind;
    ...
    show(mankind, age);
    show(mankind, height);
    show(mankind, weight);
    ...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想指出,这个例子是一个非常简单的案例。当然,如果我为每个特征创建单独的函数,或者如果我使用一种厚颜无耻的方式,比如传递一个字符串“年龄”或“身高”或“体重”作为参数,在函数内部检查它并有每个人都有一个完全独立的案例。

但是,此类解决方法在问题的一般情况下不起作用,尤其是当我有许多不同类型的结构(通过 atemplate Tvector< T >)和功能时。

Nat*_*ica 3

我更喜欢用 lambda 方法来解决这个问题。如果函数不知道要打印什么,只知道调用代码,那么您可以将 lambda 传递给包含要打印内容的代码的函数。这样你就可以使该函数完全通用,例如

template <typename T, typename Func>
void show(vector<T> const& elements, Func f){
    for (auto const& e : elements)
        cout << f(e)<< endl;
}
Run Code Online (Sandbox Code Playgroud)

然后你会这样称呼它

show(mankind, [](auto const& e){return e.age;});
show(mankind, [](auto const& e){return e.height;});
show(mankind, [](auto const& e){return e.weight;});
Run Code Online (Sandbox Code Playgroud)

std::sort如果 show 需要按顺序显示此成员,那么您甚至可以在调用like时利用 lambda

template <typename T, typename Func>
void show(vector<T>& elements, Func f){
    std::sort(elements.begin(), elements.end(), [=](auto const& lhs, auto const& rhs){return f(lhs) < f(rhs);});
    for (auto const& e : elements)
        cout << f(e)<< endl;
}
Run Code Online (Sandbox Code Playgroud)

因此,要打印的元素用于排序向量并打印元素。