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());
};
};
Merci. Je suis un peu rouillé dans les gabarits. Ceci fonctionne entièrement – OllieB
@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
Désolé, oui. Votre réponse n'a pas inclus de code quand j'ai commenté – OllieB