In Bezug auf eine frühere Anfrage (Is it possible to return an object of type T by reference from a lambda without using trailing return type syntax?), I gefragt, ob es einen anderer signifikanter Fall oder Beispiel ist, in der nachlauf return-Typ Syntax, wenn Lambdas verwenden, kann nicht vermieden werden.Gibt es Fälle, in denen die Syntax des schleppenden Rückgabetyps in Lambda nicht vermieden werden kann?
Antwort
In C++ 14, ein bisschen konstruiertes Beispiel ist die Verwendung von sfinae in Kombination mit einem allgemeinen Lambda:
[](auto &&arg)
-> decltype(arg.f(), void())
{ /* do whatever you want */ }
konnte man jedenfalls argumentieren, dass ein static_assert
genügt:
[](auto &&arg) {
static_assert(has_metod_f<std::decay_t<decltype(arg)>>::value, "!");
/* do whatever you want */
}
Wo has_method_f
ist das übliche Detektor-Idiom.
Wie auch immer, einen Fall vorstellen, wo Sie aus einer Reihe von lambdas Starten eines komponierten Funktors bauen wollen:
#include<utility>
#include<iostream>
template<typename...>
struct Base;
template<typename Func, typename... Others>
struct Base<Func, Others...>: Func, Base<Others...> {
Base(Func func, Others... others)
: Func{std::move(func)}, Base<Others...>{std::move(others)...}
{}
template<typename... Args>
auto operator()(int, Args&&... args)
-> decltype(Func::operator()(std::forward<Args>(args)...)) {
Func::operator()(std::forward<Args>(args)...);
}
template<typename... Args>
auto operator()(char, Args&&... args) {
Base<Others...>::operator()(0, std::forward<Args>(args)...);
}
};
template<>
struct Base<> {
template<typename... Args>
auto operator()(Args&&...) {
std::cout << "fallback" << std::endl;
}
};
template<typename... Ops>
struct Mixin: Base<Ops...> {
Mixin(Ops... ops)
: Base<Ops...>{std::move(ops)...}
{}
template<typename... Args>
auto operator()(Args&&... args) {
return Base<Ops...>::operator()(0, std::forward<Args>(args)...);
}
};
struct T { void f() {} };
struct U {};
int main() {
auto l1 = [](auto &&arg) -> decltype(arg.f(), void()) {
std::cout << "accept T" << std::endl;
};
auto l2 = [](U) {
std::cout << "accept U" << std::endl;
};
Mixin<decltype(l1), decltype(l2)> mixin{std::move(l1), std::move(l2)};
mixin(T{});
mixin(U{});
mixin(0);
}
In diesem Fall wäre ein static_assert
die Kompilierung verhindern, und es ist nicht das erwartete Ergebnis.
Auf der anderen Seite kann der nachfolgende Rückgabetyp verwendet werden, um sfinae direkt auf den Lambdas mit Hilfe ihrer Wrapper zu aktivieren.
Ich nehme an, dass ein anderer Fall ist, wenn es Typinkonsistenz zwischen differents gibt.
Ein dummes Beispiel
std::function<long(int)> f
= [](int v) -> long { if (v) return v; else return 0L; };
Offensichtlich Sie es, wenn Sie Inkonsistenzen vermeiden vermeiden kann, damit ich weiß nicht, ob es von Bedeutung ist.
Nein, [Sie können es in Ihrem Fall vermeiden] (https://godbolt.org/g/dIwUrY). – skypjack
@skypjack - rechts; genau was ich meine mit "Sie können es vermeiden, wenn Sie Inkonsistenz vermeiden"; nehmen Sie an, dass das Beispiel sehr sehr dumm ist. – max66
Ich sehe, aber bitte lassen Sie mich sagen, dass es die Frage nicht beantwortet. Dies kann in diesem Fall leicht vermieden werden. – skypjack
- 1. Gibt es Fälle, in denen eine 32-Bit-Variable nicht richtig ausgerichtet werden konnte
- 2. Gibt es Fälle, in denen der Destruktor in PHP NICHT aufgerufen wird?
- 3. Liste der Fälle, in denen USING-Anweisung verwendet werden sollte
- 4. Gibt es Fälle, in denen Application.Exit() das FormClosing-Ereignis nicht auslöst?
- 5. Gibt es Fälle, in denen es falsch ist, push_back durch emplace_back zu ersetzen?
- 6. UIImageView, wechselnde .image Ergebnisse in relayout - kann es vermieden werden?
- 7. DateTimePicker Standardwert: Wie kann es vermieden werden?
- 8. Gibt es Fälle, in denen ein "finally" -Konstrukt in C++ nützlich wäre?
- 9. Wie kann System.IO.PathTooLongException vermieden werden?
- 10. Gibt es Fälle, in denen es besser ist Sigmoid Aktivierung über ReLu
- 11. Gibt es bestimmte Fälle, in denen eine native Textbearbeitung wünschenswerter ist als Regex?
- 12. Gibt es Fälle, in denen setTimeout (.., 0) besser ist als requestAnimationFrame()?
- 13. Gibt es Fälle, in denen Python-Threads den gemeinsamen Status sicher manipulieren können?
- 14. Wie kann MSDTC vermieden werden?
- 15. Wie kann FileNotFoundException vermieden werden?
- 16. Wie Duplizierungsschnittstelle in TypeScript vermieden werden kann
- 17. Kann ich den vollständigen Namen des Rückgabetyps irgendwie nicht ausgeben?
- 18. Gibt es Szenarien, in denen C4172 Visual C++ - Warnung nicht als Fehler betrachtet werden sollte?
- 19. Gibt es etwas, das nicht in Klammern angezeigt werden kann?
- 20. Kann NHibernate.ObjectNotFoundException vermieden werden, wenn ein Fremdschlüssel vorhanden ist, die referenzierte Zeile jedoch nicht existiert?
- 21. Lambda-Syntax in Schema Sprache
- 22. gibt es eine Lambda-Funktion, die keine Methodenreferenz sein kann
- 23. Fälle, in denen float == und! = Keine direkten Gegensätze sind
- 24. TaskCancellationException, wie die Ausnahme im Erfolgskontrollfluss vermieden werden kann?
- 25. GHC Overlapping Fälle, in denen zusätzlich zu verallgemeinern
- 26. Wann sollten Erweiterungsmethoden vermieden werden?
- 27. Wie kann diese stackoverflow-Ausnahme vermieden werden?
- 28. Liste der Fälle, in denen equals() und hashcode() -Methode intern in Java aufgerufen werden
- 29. C++ kürzere Lambda-Syntax
- 30. Wie kann eine Exit-Bestätigung vermieden werden?
Wenn Sie ein (temporäres) Objekt zurückgeben möchten, ohne einen Typ anzugeben. Wie 'return {a, b, c};' – SergeyA
Wenn Sie einen Verweis auf ein Objekt zurückgeben möchten. – 0x499602D2
@SergeyA Ich schrieb: kann ** nicht ** vermieden werden – FdeF