有没有办法将对象的字段隐式传递给C++中的函数

Lig*_*uzz 3 c++ function c++11

假设我有一个对象

class Obj {
public:
    int a;
    int b;
    int c;
}
Run Code Online (Sandbox Code Playgroud)

和一系列对象

Obj o[N];
Run Code Online (Sandbox Code Playgroud)

我想将每个Obj.a复制到一个int数组中,我知道其他语言允许我在C++中创建一个看起来像这样的函数

int & fun(Obj os[], T key, int N){
    int a[N];
    for (int i=0; i<N; i++) {
       a[i] = os[i].key;
    }
    return a;
}
Run Code Online (Sandbox Code Playgroud)

在C++中有没有可重复使用的方法?作为参考,Obj的代码不能被修改.

jua*_*nza 7

这就是该std::transform功能的用途.您需要提供的只是一个从中获取所需元素的函数Obj.此示例显示如何执行此操作std::mem_fn:

#include <algorithm>
#include <functional>
#include <iterator>    
#include <iostream>

struct Obj { int a, b, c; };

int main() {

    Obj o[3] = {{1, 2, 3}, {11, 22, 33},{111, 222, 333}};

    int a[3];

    std::transform(std::begin(o), std::end(o),
                   std::begin(a),
                   std::mem_fn(&Obj::a));

    for (auto e : a)
        std::cout << e << ' ';

    std::cout << std::endl;
};
Run Code Online (Sandbox Code Playgroud)

输出:

1 11 111

这可以全部包含在辅助函数中,以允许调用者设置要提取的属性.但请注意,如果你真的想要一个函数来返回一个数组,你需要使用一个可复制的类型,如std::arraystd::vector.在C++中,普通数组不可复制,因此无法通过函数的值返回.