std::map
转换功能的以下模板不起作用。如果我使用transform_map()
,则编译器无法推断出要查找模板的类型。怎么办呢?
template <class Key, class FromValue, class ToValue, class Transformer>
std::map<Key, ToValue> transform_map(const std::map<Key, FromValue>& _map,
Transformer _tr) {
std::map<Key, ToValue> res;
std::for_each(_map.cbegin(), _map.cend(),
[&res, &_tr](const std::pair<const Key, FromValue>& kv) {
res[kv.first] = _tr(kv.second);
});
return res;
}
答案 0 :(得分:4)
对您传入的参数进行功能模板的推导。由于ToValue
与任何传入的参数无关,因此无法推断出。{/ p>
您可以通过告诉编译器默认使用Transformer
调用FromValue
时返回的值来解决此问题。
#include <iostream>
#include <map>
#include <algorithm>
template <class Key, class FromValue, class Transformer, class ToValue = decltype(std::declval<Transformer>()(std::declval<FromValue>()))>
std::map<Key, ToValue> transform_map(const std::map<Key, FromValue>& _map,
Transformer _tr) {
std::map<Key, ToValue> res;
std::for_each(_map.cbegin(), _map.cend(),
[&res, &_tr](const std::pair<const Key, FromValue>& kv) {
res[kv.first] = _tr(kv.second);
});
return res;
}
int main ()
{
std::map<int, double> m1 {{1, 1.5}, {2, 2.5}};
auto m2 = transform_map(m1, [](double d){ return static_cast<int>(d); });
for (auto& p : m1)
std::cout << p.first << " " << p.second << std::endl;
for (auto& p : m2)
std::cout << p.first << " " << p.second << std::endl;
}