Dies ist eine allgemeine, skelettierte Version eines Vorlagenproblems, das ich in C++ habe. Ich kann nicht ganz herausfinden, wie man die bar
Funktionsschablone als plausiblen Kandidaten erkennt, wenn sie von foo
aufgerufen wird.C++ Kandidat Vorlage Ignorierter Fehler beim Übergeben von Lambda als Argument für std :: function
#include <iostream>
#include <cstdlib>
#include <unordered_map>
template<class T>
std::unordered_map<std::string, T> getStr2TMap() {
return {}; // suppose logic here is a bit more involved
}
template<class T>
std::unordered_map<int, T> getInt2TMap() {
return {}; // suppose logic here is a bit more involved
}
template<class U, class T>
void bar(
const std::function<void (std::unordered_map<U, T>&&)>& baz
) {
if (rand() % 2 > 0) {
baz(getInt2TMap<T>());
} else {
baz(getStr2TMap<T>());
}
}
template<class T>
void foo(
const std::unordered_map<std::string, T>& map1
) {
bar([&map1](auto&& map2) {
// do some things with map1 and map2
});
}
int main() {
std::unordered_map<std::string, int> myMap;
foo<int>(myMap);
}
EDIT
stark vereinfachte Version des Codes, gleiche Fehler. Ich suche jedoch nach Lösungen für die obige Version, nicht diese.
#include <iostream>
#include <functional>
#include <unordered_map>
template<class T>
void foo(
const std::function<void (std::unordered_map<int, T>&&)>& bar
) {
std::unordered_map<int, T> myMap;
bar(myMap);
}
int main() {
foo([](auto&& m) {
});
}
Es sieht aus wie ein Teil des Problems ist hier, dass ich explizit eine Art arg zu übergeben, wenn ich 'foo' nennen? Gibt es eine Möglichkeit, es abzuleiten? – Kvass