Bonjour,

J'aimerais utiliser le frameworks QtConcurrent, et plus précisément la fonction mappedReduced, avec des "fonctions objets". J'ai trouvé la documentation à ce sujet, il est marqué que l'on peut les utiliser, mais je n'ai pas trouver d'exemple, et tous mes tests ne fonctionnent pas. Voici le code (exemple) que j'utilise :

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
31
32
33
34
35
36
37
38
39
 
#include <QApplication>
#include <QtConcurrentMap>
#include <QList>
 
//struct Puissance;
struct Puissance {
    Puissance(const int& p) : m_p(p) {}
    typedef double result_type;
    double operator() (const double & n) { int i = m_p; double r = 1.; while(i-->0) r*=n; return r; }
    int m_p;
};
 
//struct Somme;
struct Somme
{
    Somme() {}
    typedef void result_type;
    void operator() (double & result, const double & n) { result += n; }
};
 
void somme(double & result, const double & n) { result += n; }
 
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
 
  QList<double> l;
  l << 1 << 2 << 3 << 4;
  qDebug() << l;
 
  Puissance p(8);
  Somme s;
  //  QFuture<double> res = QtConcurrent::mappedReduced(l, p, s);  // ne fonctionne pas
  QFuture<double> res = QtConcurrent::mappedReduced(l, p, somme);
  qDebug() << res.result();
 
  return app.exec();
}
Le but du programme est de faire la somme des éléments de la liste en les élevant au préalable à une certaine puissance. Le code posté fonctionne en utilisant la fonction somme, et ne fonctionne pas si on la remplace par l'object Somme, comme indiqué dans la ligne commentée. Je ne comprends pas pourquoi cela ne fonctionne pas, d'autant que l'object fonction Puissance est lui accepté.

L'erreur de compilation est :
main.cpp:33: error: no matching function for call to ‘mappedReduced(QList<double>&, Puissance&, Somme&)’
Bien sur dans le code final, j'ai besoin d'un objet pour y stocker un état, une fonction comme "somme" ne suffit pas.

Est ce que quelqu'un à une solution à ce problème ?

Merci d'avance