2017-09-25 6 views
2

this blogに多少触発されていますが、私はC++で一般化されたFunctorクラスを作成しようと考えていました。私はあまり出かけることはありません。私はテンプレートを正しく理解するために言い訳として使っています。std :: functionをテンプレートテンプレートのパラメータとして

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

かなり混乱した後、私は困惑しています。私はコンパイラエラーを持っています

私は迷っています。率直に言って、私はこれを宣言しました。助言がありますか?私は最新のコンパイラgcc 7.2を使ってC++ 17を使ってコンパイルしています。私はC++ 14が必要だと思っています。

ところで、私は非常に喜んでFunctorあなたが部分的に特化した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()); 
    }; 
}; 

答えて

3

の非一般的なバージョンをコンパイルすることができます。それは大丈夫ですが、あなたの専門はメンバーを宣言しません。具体的には、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()> 
    ); 
}; 
+0

ありがとうございました。私はテンプレートで少し錆びています。これは完全に働いています – OllieB

+0

@OllieB - あなたはその質問を意味しましたか?しないでください。それは私の答えを無効にします。新しい質問がある場合は(投稿のように)質問してください。 – StoryTeller

+0

申し訳ありません。あなたの答えは私がコメントしたときにコードを含んでいません – OllieB

関連する問題