Existe-t-il des objets fonction dans le boost qui sont des équivalents génériques de la famille d'objets std :: equal_to, std :: greater etc.?Équivalent générique aux objets de fonction std
Essentiellement, std :: equal_to devrait devenir quelque chose comme
struct generic_equal_to
{
template <class T, class U>
bool operator()(const T& t, const U& u) const
{
return t == u;
}
};
Je peux voir comment les versions génériques de std :: etc., plus peut-être plus délicat en raison de problèmes avec le type de retour (si le decltype
peut résoudre cela). Je ne vois pas pourquoi l'objet std :: equal_to function lui-même devrait avoir besoin d'un argument template.
Sûrement quelque part dans boost ou dans la STL ces versions existent? Ils sont, bien sûr, triviaux à écrire, mais je n'aime pas trop reproduire le code de la bibliothèque, en particulier pour quelque chose d'aussi trivial que celui-ci.
EDIT:
Comme un contexte à pourquoi je voudrais au lieu d'utiliser lambdas, ou une autre méthode de génération fonction objet:
je en train d'écrire une fonction de comparaison de séquences boost::fusion
générique ainsi:
template <class T>
bool sequence_equal(const T& left, const T& right)
{
return fusion::all(
fusion::zip(left, right),
fusion::fused<generic_equal_to>());
}
Notez la partie fusion::fused<generic_equal_to>
, ce qui conduit à l'isse que vous ne pouvez pas spécifier pratiquement un boost::lambda
ou boost::phoenix
fonction-objet par type. Je suppose qu'une solution pourrait être decltype:
fusion::fused<decltype(_1 == _2)>()
Cela semble très difficile cependant, et pourrait ne pas fonctionner même, selon la façon dont boost::lambda
ou boost::phoenix
est mis en œuvre - Je ne suis vraiment pas sûr.
Je sais que vous pouvez utiliser fusion::make_fused
pour contourner tout ce problème, mais vous devez ensuite instancier l'objet fonction. La solution que je pensais, alors, serait un non-modèle equal_to
struct - j'ai appelé le mien generic_equal_to
.
Je sais que c'est un problème très trivial - après tout, make_fused(_1 == _2)
va probablement s'incorporer à peu près le même assemblage que fused<generic_equal_to>
. Je ne pouvais pas croire qu'il n'y avait pas d'objet fonction generic_equal_to
dans boost ou dans la STL n'importe où, d'où cette question.
Je pense que vous voulez dire '' –
+1 opérateur() (const T & T, U const & u), mais je ne pense pas que vous trouverez celui qui est pris en charge. Le problème est important (je viens d'écrire ce même code dans [une réponse] (http://stackoverflow.com/questions/10063037/unordered-set-storing-elements-as-pointers/10063081#10063081) hier, mais c'est pas assez sexy pour attirer les développeurs de Boost, et 'std :: equal_to' n'est pas assez cassé pour que le comité de standardisation le déprécie. – Potatoswatter
@ AndrewTomazos-Fathomling hah yep! Essayer d'écrire du code sans ordinateur pour vérifier ma syntaxe * toujours * me fait remonter quelque part – Ayjay