Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Framework  (Lu 57098 fois)

0 Membres et 3 Invités sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #150 le: Décembre 27, 2013, 12:03:40 pm »
Bon, j'ai rien dis, je vais en revenir à std::function et à std::bind.  :P

Je pensais que ce code-ci s'exécuterait :

#ifndef FUNCTION
#define FUNCTION
namespace sfgl {
template<typename R> class Function {
    public :
    template <typename ...A>  Function (R(*f)(A...)) : function(&f) {

    }
    template <typename ...A> R operator()(A... args) {
        R(*func)(A...) = *reinterpret_cast<R**>(&function);

        return func(args...);
    }
    private :
    R* function;
};
 
Mais en fait non de plus j'ai du rajouté l'option -fpermissive pour que ça compile donc je sais pas si c'est une bonne idée de caster un void* en pointeur de fonction.

Voici ce que me donne le débugueur :
#0 0028FEBD ?? () (??:??)
#1 004010FD __mingw_CRTStartup () (??:??)
#2 00401295 mainCRTStartup () (??:??)

PS : de plus il me semble qu'on ne peut pas faire ça avec des fonctions membres.
« Modifié: Décembre 27, 2013, 12:06:17 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #151 le: Décembre 27, 2013, 12:41:27 pm »
Avec std::function et std::bind y'a pas moyen non plus :

function<void()> func = std::bind(&f, placeholders::_1);
Signal s(func);
s.emit("text");
 

Ce code ne compile pas.

Le mien compile par contre avec -fpermissive mais provoque un crash.

Bref je pense que je vais devoir abandonner mon idée, et passer à un type de fonction bien précis.

Mais avant de faire ça, je vais finir la version 1.
« Modifié: Décembre 27, 2013, 12:43:51 pm par Lolilolight »

Canadadry

  • Hero Member
  • *****
  • Messages: 1081
    • Voir le profil
Re : Framework
« Réponse #152 le: Décembre 27, 2013, 04:01:12 pm »
Si tu veux faire des signaux slots en C++ t'as deux solutions :
  • utilise FastDelegate tu trouvera plein d'implémentation de sinaux qui s'en servent
  • utilise C++11 et c'est std::function par exemple http://pastebin.com/aKb8y71B

Pour ce qui est de stocker les arguments regarde l'exemple. C'est faisable avec un tuple et des variadic template.

Et s'il te plais arrête tes monologues.   :)

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #153 le: Décembre 27, 2013, 08:50:50 pm »
Ok, oui je sais que c'est faisable pour stocker les arguments je l'ai même fait, c'est pour stocker un pointeur sur une fonction quelconque que apparemment ce n'est pas faisable. (Ce que je trouve dommage)

Nexus

  • SFML Team
  • Hero Member
  • *****
  • Messages: 6287
  • Thor Developer
    • Voir le profil
    • Bromeon
Re : Framework
« Réponse #154 le: Décembre 28, 2013, 12:23:22 am »
Comme je t'ai déjà dit, il faut apprendre les concepts de std::function avant de l'utiliser. Ca sert à rien si nous repondons toutes tes questions et expliquons chaque détail, juste parce que tu n'as pas envie de lire la documentation...
Zloxx II: action platformer
Thor Library: particle systems, animations, dot products, ...
SFML Game Development:

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #155 le: Décembre 28, 2013, 01:25:02 pm »
Je l'ai lue le peu de doc que j'ai trouvé sur ce sujet mais c'est bon je vais m'en sortir..., il faut juste que je fasse une classe qui lie un id à un signal, afin de faire un contenaire de signaux.
Et comme je te dis j'ai essayer de faire un pointeur sur une fonction quelconque afin de stocker et std::function<void()> et l'appeler plus tard en lui passant des arguments, mais, y'a pas moyen std::function<void()> en fait c'est juste un foncteur et pas une fonction.

Mais je ne sais pas ou tu l'a trouvé la doc sur std::function parce que moi j'en ai pas trouvé beaucoup.
« Modifié: Décembre 28, 2013, 01:26:56 pm par Lolilolight »

Nexus

  • SFML Team
  • Hero Member
  • *****
  • Messages: 6287
  • Thor Developer
    • Voir le profil
    • Bromeon
Zloxx II: action platformer
Thor Library: particle systems, animations, dot products, ...
SFML Game Development:

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #157 le: Décembre 29, 2013, 10:00:41 am »
J'ai réussi!  :D

Par contre le code source n'est pas simple à comprendre.

#ifndef FUNCTION
#define FUNCTION

namespace sfgl {
namespace helper {
    template<int ...> struct seq {};

    template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};

    template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };
}
template<typename R> class Function {
    public :
    template <typename ...A>  Function (R(*f)(A...)) : function(&f) {

    }
    template <typename ...A> R operator()(A... args) {
        R(*func)(A...) = *reinterpret_cast<R**>(function);
        std::tuple<A...> params = std::make_tuple(args...);
        return  callFunc(typename helper::gens<sizeof...(A)>::type(), params);
    }
    template<int ...S,typename ...A>
    R callFunc(helper::seq<S...>, std::tuple<A...> params)    {
         R(*func)(A...) = *reinterpret_cast<R**>(function);
        return f(std::get<S>(params) ...);
    }
    private :
    R** function;
};
 

Ce que je voulais faire c'est wrapper n'importe quel type de pointeur sur fonction pour l'appeler plus tard.

Afin de wrapper ensuite ces pointeurs de fonctions dans un conteneur avec un id ainsi j'appelle le bon pointeur de fonction en passant l'id du pointeur de fonction au conteneur.

void f (std::string text, std::string text2) {
    std::cout<<"I'm a function "<<text<<" "<<text2<<endl;
}
int main () {
    std::map<std::string, Function<void>> ptrfunc;
    Function<void> f1 = &f;
    ptrfunc.insert(std::pair<std::string, Function<void>>("Fonction test", f1));
    std::map<std::string, Function<void>>::iterator it = ptrfunc.find("Fonction test");
    it->second("text1", "text2");
    return 0;
}
 

Ainsi je stocke tout mes signaux dans un conteneur en les liant à une action, et lors du déclenchement d'un event, j'appelle la bonne fonction suivant son id en lui passant les paramètres que je veux.

Je ne sais pas si cette technique peut marcher avec les fonctions membres par contre. (Faut que je continue mes tests)

Et d'après ce que j'ai pu lire, std::function et std::bind ne permettent pas de faire ça. :/ (Voilà de quoi je parlais quand je disais "faire mieux que std::function".)
« Modifié: Décembre 29, 2013, 10:04:18 am par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #158 le: Décembre 29, 2013, 01:55:54 pm »
Lol, juste lol, j'ai du remplacer les std::string par des char* pour les arguments de ma fonction f pour que ça marche. (Sinon ça crash)

Le temps est venu de revenir au C les amis.  :D




cobra.one

  • Newbie
  • *
  • Messages: 26
    • Voir le profil
Re : Framework
« Réponse #159 le: Décembre 29, 2013, 05:09:13 pm »
Passionant...