4 votes

stocker mem_fun dans un conteneur standard

Existe-t-il un moyen de créer un vector< mem_fun_t< ReturnType, MyClass > > ?

L'erreur que je vois est la suivante :

error C2512: 'std::mem_fun1_t<_Result,_Ty,_Arg>' : no appropriate default constructor available

4voto

Je ne vois vraiment pas pourquoi cela ne fonctionnerait pas, mais c'est en fait une solution assez laide. Il suffit de prendre vector<function<ReturnType(MyClass*)>> et de ne pas être confronté aux problèmes que posent les classeurs C++03.

3voto

UncleBens Points 24580

Vous pouvez certainement créer un tel vecteur.

#include <vector>
#include <functional>
#include <iostream>

struct MyClass
{
    int a()  { return 1; }
    int b()  { return 2; }
};

int main()
{
    std::vector<std::mem_fun_t<int, MyClass> > vec;
    vec.push_back(std::mem_fun(&MyClass::a));
    vec.push_back(std::mem_fun(&MyClass::b));
    MyClass x;
    for (size_t i = 0; i != vec.size(); ++i) {
        std::cout << vec[i](&x) << '\n';
    }
}

Si vous rencontrez des problèmes, lisez attentivement le message d'erreur. Par exemple, le message d'erreur std::mem_fun peut renvoyer toutes sortes d'enveloppes, en fonction de ce que vous lui passez.

Ou bien, en effet, passer à boost ou à C++0x function .


Edit : Avec ce message d'erreur particulier, je suppose que vous faites quelque chose qui invoque le constructeur par défaut pour le type contenu (par ex. resize ou en spécifiant la taille dans le constructeur du vecteur). Vous ne pouvez pas utiliser ces fonctions.

2voto

Mike Seymour Points 130519

mem_fun_t remplit les conditions requises pour être stocké dans un conteneur (il peut être construit à partir de copies et peut être cédé), la réponse est donc oui.

Cependant, il n'est pas constructible par défaut ou comparable, de sorte qu'il y a certaines choses que vous ne pouvez pas faire avec un conteneur de ce type :

  • Redimensionnement, à moins que vous ne fournissiez une valeur à remplir avec
  • Construire avec une taille non nulle, à moins que vous ne fournissiez une valeur à remplir avec
  • Comparaison des conteneurs

L'erreur que vous rencontrez provient d'une tentative de redimensionnement ou de construction avec une taille.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X