gpt4 book ai didi

c++ - 如何将 std::map 转换为 std::function?

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

A std::map<K,V>实现 std::function<V(K)> 类型的部分 函数.

我正在尝试实现一个通用函数 map2fun()变成 std::map进入 std::function对象。

以下不编译:

template<typename M>
function<M::mapped_type(M::key_type)> map2fun(M& m)
{
return [&m](M::key_type k)
{
return m[k];
};
}

我的问题是:

  • C++11 的 STL 中是否有类似的功能可用?
  • 如果没有,我如何使用 C++11 实现它?

最佳答案

Is there a similar functionality available in the STL for C++11?

没有,据我所知。

但恕我直言,std::map 本身是“C++11(以及 C++98)的 STL 中可用的类似功能”。

If not, how can I implement it with C++11?

通过示例将一些typename 添加到您的代码中

template <typename M>
std::function<typename M::mapped_type(typename M::key_type)> map2fun (M & m)
{ return [&m](typename M::key_type k) { return m[k]; }; }

但我觉得这样更清楚

template <typename K, typename V>
std::function<V(K)> m2f2 (std::map<K, V> & m)
{ return [&m](K k) { return m[k]; }; }

但是,正如 Jarod42 所指出的(谢谢!),此拦截仅 std::map(不是 std::unordered_map,不是相似的(也是自定义的)类型) , 所以你可以像下面这样让它更灵活

template <template <typename ...> class C, typename K, typename V,
typename ... Ts>
std::function<V(K)> m2f2 (C<K, V, Ts...> & m)
{ return [&m](K k) { return m[k]; }; }

并且,从C++17开始,简化如下

template <template <typename ...> class C, typename K, typename V>
std::function<V(K)> m2f2 (C<K, V> & m)
{ return [&m](K k) { return m[k]; }; }

作为 Jarod42 的指针(再次感谢!)这个模板模板版本也为其他容器启用(std::vector,例如),这给出了一个非常丑陋的错误消息(不是简单明了的“map2fun() 未实现”。

如果 C 容器定义了 mapped_type 类型,您可以使用 SFINAE 避免这个问题,仅(通过示例)启用该功能;我是说

template <template <typename ...> class C, typename K, typename V,
typename ... Ts, typename = typename C<K, V, Ts...>::mapped_type>
std::function<V(K)> m2f2 (C<K, V, Ts...> & m)
{ return [&m](K k) { return m[k]; }; }

但是现在我的简单版本比你原来的版本更复杂 :( .

下面是一个完整的双示例

#include <map>
#include <iostream>
#include <functional>
#include <unordered_map>

template <typename M>
std::function<typename M::mapped_type(typename M::key_type)> m2f1 (M & m)
{ return [&m](typename M::key_type k) { return m[k]; }; }

template <template <typename ...> class C, typename K, typename V,
typename ... Ts, typename = typename C<K, V, Ts...>::mapped_type>
std::function<V(K)> m2f2 (C<K, V, Ts...> & m)
{ return [&m](K k) { return m[k]; }; }

int main ()
{
std::map<int, long> m1 {{0, 1L}, {1, 2L}, {2, 4L}, {3, 8L}};
std::unordered_map<int, long> m2 {{0, 1L}, {1, 2L}, {2, 4L}, {3, 8L}};

auto l1 { m2f1(m1) };
auto l2 { m2f2(m2) };
auto l3 { m2f1(m1) };
auto l4 { m2f2(m2) };

std::cout << l1(2) << std::endl;
std::cout << l2(2) << std::endl;
std::cout << l3(2) << std::endl;
std::cout << l4(2) << std::endl;
}

关于c++ - 如何将 std::map 转换为 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50565038/

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