これはC++でのテンプレート問題の一般的なスケルトンバージョンです。私は、foo
から呼び出されたときにbar
ファンクションテンプレートをもっともらしい候補として認識させる方法を考え出すことはできません。C++候補テンプレート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
コードの多くは単純化されたバージョン、同じエラー。私はこのバージョンではなく、上記のバージョンのソリューションを探しています。
#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) {
});
}
ここでの問題の一部は、私は私が 'foo'呼び出すときに明示的に型引数を渡す必要があるということであるように見えますか?それを推論する方法はありますか? – Kvass