Bonjour,
J'aurais aime savoir pourquoi nous n'avons pas a notre disposition une fonction std::make_function a l'effigie de std::make_shared, std::make_pair ou encore std::make_tuple (pas sur pour ce dernier).
Merci d'avance!
Bonjour,
J'aurais aime savoir pourquoi nous n'avons pas a notre disposition une fonction std::make_function a l'effigie de std::make_shared, std::make_pair ou encore std::make_tuple (pas sur pour ce dernier).
Merci d'avance!
Bonjour,
Je ne sais pas précisément ce que vous voulez faire, mais je pence que std::bind devrais répondre a vos besoin. (ou les expressions lambda)
Imaginons le code suivante :
Les deux commentaires provoquent une erreur de compil, alors qu'en passant par des fonctions temporaire pas de soucis en utilisant les même mécanisme (lambda et std::bind).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #include <functional> #include <iostream> template<typename Res, typename... Args> void foo(const std::function<Res(Args...)> &f) { /* Some code */ } struct A { void bar() {} }; int main() { //foo( []() {std::cout << std::endl;} ); std::function<void()> f = []() {std::cout << std::endl;}; foo( f ); A a; //foo( std::bind(&A::bar, &a) ); std::function<void()> g = std::bind(&A::bar, &a); foo(g); return 0; }
Je ne vais pas grappiller sur çà c'est surtout une question de reflexion!
Bonsoir,
Prenons le problème sous un autre angle :
Ce code fonctionne parfaitement, maintenant imagines qu'il existe une fonction tel que tu le proposes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include<iostream> #include<functional> struct Func { void operator()(int) const { std::cout << 0; } void operator()(int,int) const { std::cout << 1; } }; int main() { std::function<void(int)> f1 = Func(); std::function<void(int,int)> f2 = Func(); f1(0); f2(0,0); };
Quel va être le type déterminé par auto ? std::function<void(int)> ou std::function<void(int,int)> ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template<class F> std::functor</*déterminer par F*/> make_functor(F f) { /*code*/ } //avec le code précédent auto f = make_functor(Func());
Cependant on pourrait le faire en partant d'un pointeur de fonction, c'est un peu ce que fait bind (ca retourne une classe du genre BindHelper, qui est un foncteur dont les paramètres de l'opérateur () sont déterminé pas le pointeur de fonction).
Pour les lambdas, le type est spécifique et je ne connais pas assez ces spécificités pour en dire plus. Et si on utilisait les lambda de boost le problème est tout autre : ils sont polymorphiques, ainsi les types sont non déterminé.
Pour ton problème, il faut que tu fasses comme pour les algorithmes de la bibliothèque standard :
Le but de std/boost::function c'est de proposer un wrapper pour la notion de foncteur, ce n'est pas les foncteur en eux-même, un foncteur étant n'importe quelle classe proposant un opérateur (). L'utilité de std/boost::function est ainsi de pouvoir récupérer ces différents types foncteurs et de les traiter de manière identique (typiquement : les stocker).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 template<class F> void foo(F f) { /*code*/ } template<class F> void foo(F&& f) { /*code*/ }
D'accord je vais m'orienter de ce côté là. Par contre tu peux me dire la différence entre ces deux fonctions :
Merci beaucoup!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<class F> void foo(F f) { /*code*/ } template<class F> void foo(F&& f) { /*code*/ }
Salut,
Le premier utilisera une copie du paramètre, le second un déplacement. Si le callable est trivial, une copie devrait suffire. Si des ressources couteuses sont utilisées, alors le déplacement devrait être préférable.
Merci!
P.S. Sur le post suivant on traite des rref et std::forward pour ceux intéressés. http://www.developpez.net/forums/d11...e/#post6326012
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager