Sie pointer-to-Mitglied Syntax verwenden:
#include <iostream>
#include <memory>
struct Obj {
int a;
int b;
};
std::unique_ptr<int[]>
fn(Obj* os, size_t N, int Obj::*member)
{
auto arr = std::make_unique<int[]>(N);
for (size_t i = 0; i < N; ++i) {
arr[i] = os[i].*member;
}
return arr;
}
int main() {
Obj os[] { { 1, 10 }, { 2, 20 } };
auto a1 = fn(os, 2, &Obj::a);
auto a2 = fn(os, 2, &Obj::b);
for (size_t i = 0; i < 2; ++i) {
std::cout << i << ": " << a1[i] << ", " << a2[i] << '\n';
}
}
Demo: http://ideone.com/cQMyh3
Oder Sie könnten ein Lambda verwenden.
#include <iostream>
#include <memory>
struct Obj {
int a;
int b;
};
std::unique_ptr<int[]>
fn(Obj* os, size_t N, std::function<int(const Obj&)> keyFn)
{
auto arr = std::make_unique<int[]>(N);
for (size_t i = 0; i < N; ++i) {
arr[i] = keyFn(os[i]);
}
return arr;
}
int main() {
Obj os[] { { 1, 10 }, { 2, 20 } };
auto a1 = fn(os, 2, [](const Obj& o){ return o.a; });
auto a2 = fn(os, 2, [](const Obj& o){ return o.b; });
for (size_t i = 0; i < 2; ++i) {
std::cout << i << ": " << a1[i] << ", " << a2[i] << '\n';
}
}
http://ideone.com/9OvTzl
Oder die allgemeinere:
template<typename KeyFn>
std::unique_ptr<int[]>
fn(Obj* os, size_t N, KeyFn keyFn)
{
auto arr = std::make_unique<int[]>(N);
for (size_t i = 0; i < N; ++i) {
arr[i] = keyFn(os[i]);
}
return arr;
}
Weitere Änderungen zu berücksichtigen:
- Verwenden Sie einen Standard-Container, z.B.
vector
oder array
Ihre Obj der Hause,
- Betrachten Iteratoren über die Bereiche, anstatt einen Zeiger und eine Größe,
Sie
Ja es gibt! Verwenden Sie kein C-artiges Array und alles wird gut! – mash
"a" als Referenz zurückgeben ist UB. Müssen Sie diese Mitglieder bearbeiten können? – LogicStuff
@mash Sie missverstanden wahrscheinlich die Frage (es sei denn, es ist Ironie?) – fdreger