C++ 14 Einführung generische lambdas (wenn das Auto-Schlüsselwort in den Lambda-Signaturen verwendet).C++ 17 Vektor von Generic (Polymorphic) lambdas
Gibt es eine Möglichkeit, sie in einem Vektor mit C++ 17 zu speichern?
Ich weiß, über diese bestehende Frage, aber es ist meine Bedürfnisse nicht passen: Can I have a std::vector of template function pointers?
Hier ist ein Beispielcode veranschaulicht, was ich tun möchte. (Bitte beachten Sie die Hinweise am Ende, bevor er antwortete)
#include <functional>
#include <vector>
struct A {
void doSomething() {
printf("A::doSomething()\n");
}
void doSomethingElse() {
printf("A::doSomethingElse()\n");
}
};
struct B {
void doSomething() {
printf("B::doSomething()\n");
}
void doSomethingElse() {
printf("B::doSomethingElse()\n");
}
};
struct TestRunner {
static void run(auto &actions) {
A a;
for (auto &action : actions) action(a);
B b;
for (auto &action : actions) action(b); // I would like to do it
// C c; ...
}
};
void testCase1() {
std::vector<std::function<void(A&)>> actions; // Here should be something generic instead of A
actions.emplace_back([](auto &x) {
x.doSomething();
});
actions.emplace_back([](auto &x) {
x.doSomethingElse();
});
// actions.emplace_back(...) ...
TestRunner::run(actions);
}
void testCase2() {
std::vector<std::function<void(A&)>> actions; // Here should be something generic instead of A
actions.emplace_back([](auto &x) {
x.doSomething();
x.doSomethingElse();
});
actions.emplace_back([](auto &x) {
x.doSomethingElse();
x.doSomething();
});
// actions.emplace_back(...) ...
TestRunner::run(actions);
}
// ... more test cases : possibly thousands of them
// => we cannot ennumerate them all (in order to use a variant type for the actions signatures for example)
int main() {
testCase1();
testCase2();
return 0;
}
NOTES:
- Der Code von
A
,B
undTestRunner
kann nicht geändert werden, wird nur der Code der Testfälle - I don Ich möchte nicht diskutieren, ob es gut oder falsch ist, Tests wie diese zu programmieren, dies ist off-topic (die Testterminologie wird hier nur verwendet, um zu verdeutlichen, dass ich nicht alle lambdas aufzählen kann). .))
Auto ist ein gültiger Funktionsparameter für TestRunner in C++ 14 (https://ideone.com/4931Ht) – infiniteLoop
Diese polymorphe Lösung ist sehr clever +1. –
@infiniteLoop Sehen Sie, wie es auf [wandbox] (http://melpon.org/wandbox/permlink/qrrFmVRri4bxM0cy) mit 'auto' läuft. Beachten Sie, dass es eine GCC-Erweiterung ist, kein gültiger Parameter in C++ 14 für freie Funktionen. – skypjack