gpt4 book ai didi

c++ - std::map 转换器模板

转载 作者:太空狗 更新时间:2023-10-29 20:51:17 25 4
gpt4 key购买 nike

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

最佳答案

函数模板的推导是根据您传入的参数完成的。由于 ToValue 与任何传入的参数都不相关,因此无法推导。

您可以通过告诉编译器默认为使用 FromValue 调用 Transformer 时将返回的值来解决此问题。

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

关于c++ - std::map 转换器模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50881383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com