2017-09-25 1 views
2

Inspiré quelque peu par this blog, je pensais essayer de créer une classe Functor généralisée en C++. Je ne sors pas beaucoup. Je l'utilise comme excuse pour bien comprendre les modèles, plutôt que de simplement essayer.std :: function comme paramètre de modèle de template

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

Après un peu de déconner, je suis perplexe. J'ai l'erreur de compilation

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()>’ 

Je suis perdu. Franchement, je pensais que j'avais déclaré cela. Aucune suggestion? Je compile en utilisant un compilateur à jour, gcc 7.2 en utilisant C++ 17. Je pense que C++ 14 est tout ce qui est nécessaire cependant.

BTW, je peux compiler tout à fait heureusement une version non-général de 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()); 
    }; 
}; 

Répondre

3

Vous Functor partiellement spécialisé. Et ça va, mais votre spécialisation ne déclare aucun membre. Plus précisément, aucun membre. Rappelons qu'une spécialisation n'obtient pas automatiquement quelque chose du modèle primaire.

Il suffit donc ajouter la déclaration:

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

Merci. Je suis un peu rouillé dans les gabarits. Ceci fonctionne entièrement – OllieB

+0

@OllieB - Vous vouliez dire la question? S'il vous plaît ne le faites pas. Cela invalidera ma réponse. Demandez (comme en poste) une nouvelle question si vous en avez une. – StoryTeller

+0

Désolé, oui. Votre réponse n'a pas inclus de code quand j'ai commenté – OllieB