std :: map变换器模板

时间:2018-06-15 19:04:22

标签: c++ templates transform

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;
}

1 个答案:

答案 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;
}