簡體   English   中英

如何將std :: map轉換為std :: function?

[英]How to convert a std::map to a std::function?

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

我的問題是:

  • STL for C ++ 11中是否有類似的功能?
  • 如果沒有,我如何用C ++ 11實現它?

STL for C ++ 11中是否有類似的功能?

不,據我所知。

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

如果沒有,我如何用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()未實現”) 。

您可以使用SFINAE避免此問題,如果C容器定義mapped_type類型,則僅啟用該功能(通過示例); 我的意思是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM