簡體   English   中英

std :: function作為模板模板參數

[英]std::function as template template parameter

受此博客的啟發,我想嘗試用C ++創建一個通用的Functor類。 我沒有太多。 我以此為借口來正確理解模板,而不僅僅是涉獵。

#include <functional>

template<template <typename> typename F_, typename A>
struct Functor {

   template<typename B>
   static F_<B> fmap
      ( std::function<B(A)>
      , F_<A>
      );

};


template<typename A>
struct Functor<std::function, A(void)> {};

template<typename A>
template<typename B>
  std::function<B()> Functor<std::function, A(void)>::fmap
     ( std::function<B(A)> f
     , std::function<A()> fA
     ){
  return [&](){
     return f (fA());
  };
};

經過一番混亂之后,我很困惑。 我有編譯器錯誤

error: no ‘std::function<B()> Functor<std::function, A()>::fmap(std::function<B(A)>, std::function<A()>)’ member function declared in class ‘Functor<std::function, A()>’

我迷路了。 坦率地說,盡管我已經宣布了這一點。 有什么建議么? 我正在使用最新的編譯器,使用C ++ 17的gcc 7.2進行編譯。 我認為C ++ 14就是所需要的。

順便說一句,我可以很高興地編譯一個非通用的fmap版本

template<typename A, typename B>
std::function<B(void)> fmap1
   ( std::function<B(A)> f
   , std::function<A(void)> fA
   )
{
   return [&](){
      return f (fA());
   };
};

您是部分專業的Functor 沒關系,但是您的專業化並未聲明任何成員。 具體來說,沒有fmap成員。 回想一下,專業化並不會自動從主模板中獲取任何信息。

因此,只需添加聲明:

template<typename A>
struct Functor<std::function, A(void)>
{
    template<typename B>
   static std::function<B()> fmap
      ( std::function<B(A)>
      , std::function<A()>
      );
};

暫無
暫無

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

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