2010-11-15 51 views
4

Je veux avoir une file d'attente prioritaire avec une commande personnalisée, mais paresseuse comme je suis, je ne veux pas définir une classe de comparaison implémentant l'opérateur().std :: priority_queue: Commande personnalisée sans définir la classe de comparateur

Je voudrais vraiment quelque chose comme ceci pour compiler:

std::priority_queue<int, std::vector<int>, 
    boost::bind(some_function, _1, _2, obj1, obj2)> queue; 

où une_fonction est une fonction de retour bool prenant quatre arguments, la première et la deuxième étant ints de la file d'attente, et les deux derniers des objets nécessaires pour calculer la commande (références const).

(error: ‘boost::bind’ cannot appear in a constant-expression)

Mais cela ne compile pas. Même un plus simple,

std::priority_queue<int, std::vector<int>, &compare> queue; 

ne compilera pas, avec comparaison étant une fonction binaire retour bool.

(error: type/value mismatch at argument 3 in template parameter list for ‘template class std::priority_queue’; expected a type, got ‘compare’)

Une suggestion?

+0

Vous n'avez pas de parenthèse fermante sur le 'boost :: bind' ici - avant le> sur les params du template de file d'attente. Est-ce une faute de frappe dans le code posté ou dans ce que vous avez essayé de compiler? –

Répondre

11

Cela pourrait fonctionner:

std::priority_queue<int, std::vector<int>, 
    boost::function<bool(int,int)> > 

passer ensuite dans votre expression de liaison au constructeur de la file d'attente.

P.S. vous obtenez ces erreurs de compilation parce que vous mettez des expressions évaluées à l'exécution où un nom de type ou une expression constante sont attendus.

+3

+1, Ceci est une bonne solution. Je vais juste noter que malheureusement, ce n'est pas exactement la même chose que de fournir statiquement un paramètre de fonction/foncteur de modèle spécifique, parce que 'boost :: function' utilise l'allocation dynamique pour créer des objets de fonction variable. Ainsi, vous n'obtiendrez pas le même type d'efficacité inline générée par le compilateur qu'avec un paramètre de fonction personnalisé fourni statiquement. –

+0

@Charles: C'est bon à mentionner. –