STL Predicates

Le
meow
Bonjour,

Dans ma quête du "toujours plus propre", je suis en train d'essayer
de génériciser un algorithme à coup de prédicats paramétrables
(comprendre : on les donne en paramètre voire en classe de trait
s'il s'avère que leur nombre devient rédhibitoire au cours du
développement.).
Bref, pour cela il va falloir que j'apprenne à les utiliser, ces
prédicats, et c'est loin d'être le cas. Jusqu'à présent je n'ai ré=
ussi
à atteindre mon but qu'en utilisant unary_function< >, aussi me
demandais-je si predicate< > n'était tout simplement pas
implémentable ?

Les questions, donc :
a.) que signifie *exactement* le terme "Concept" dans la doc de la
stl ? A priori j'aurai dit que c'est un accord tacite sans code
mais unary_function existe et je peux en hériter
b.) est-ce que je peux utiliser un predicate<Point> ou ça n'existe pas
et j'ai donc raison d'utiliser unary_function<Point,bool> à la place ?
c.) s'il y a moyen d'utiliser predicate, j'imagine que c'est plus
propre, comment je fais ?

Merci
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
meow
Le #378943
Je précises mes questions :

Dans le cadre d'une application, j'ai besoin de savoir si telle ou
telle molécule d'eau est à l'intérieur d'une protéine (modélisée par
un polyèdre (représenté par une classe HDS) ). J'ai donc écrit une
classe prédicat :

class PointExteriorToHDS : public std::unary_function< Point ,bool> {
protected:
HDS const& hds;
public:
PointExteriorToHDS(HDS const& H):hds(H){}
public:
bool operator()(Point const& water) const {
}
}

qui me permet entre autre d'utiliser "negate" lorsque j'en ai besoin.

Est-ce propre ? Ais-je oublié quelque chose ? Pourquoi est-ce que
j'arrive à dériver std::unary_function et pas std::predicate alors que
tous deux sont documentés comme concepts dans le manuel de la stl ?
(manuel SGI online)
Michael DOUBEZ
Le #379554
Je précises mes questions :

Dans le cadre d'une application, j'ai besoin de savoir si telle ou
telle molécule d'eau est à l'intérieur d'une protéine (modélisée par
un polyèdre (représenté par une classe HDS) ). J'ai donc écrit une
classe prédicat :

class PointExteriorToHDS : public std::unary_function< Point ,bool> {
protected:
HDS const& hds;
public:
PointExteriorToHDS(HDS const& H):hds(H){}
public:
bool operator()(Point const& water) const {
}
}

qui me permet entre autre d'utiliser "negate" lorsque j'en ai besoin.

Est-ce propre ? Ais-je oublié quelque chose ? Pourquoi est-ce que
j'arrive à dériver std::unary_function et pas std::predicate alors que
tous deux sont documentés comme concepts dans le manuel de la stl ?
(manuel SGI online)


Je n'ai pas vu de std::predicate dans la doc SGI.

Il y a le concept de Predicate mais, pour autant que je sache, il n'a
pas de correspondance autre que std::unary_function<T,BOOL_TYPE> comme
tu l'as écris.

Michael

meow
Le #379553
Bonjour, et merci pour cette réponse

Je n'ai pas vu de std::predicate dans la doc SGI.


Oui, moi non plus

Il y a le concept de Predicate mais, pour autant que je sache, il n'a


Tout à fait, mais je n'ai pas vu de std::unary_function non plus dans
la doc, je n'ai vu que le concept (ais-je mal cherché ?). Pourtant la
classe unary_function existe et se dérive. J'en avais inféré que
Predicate devait certainement aussi se dériver d'une manière ou d'une
autre.
Merci d'avoir confirmé que ce n'est pas le cas.

Michael DOUBEZ
Le #379552
Bonjour,

Dans ma quête du "toujours plus propre", je suis en train d'essayer
de génériciser un algorithme à coup de prédicats paramétrables
(comprendre : on les donne en paramètre... voire en classe de trait
s'il s'avère que leur nombre devient rédhibitoire au cours du
développement.).
Bref, pour cela il va falloir que j'apprenne à les utiliser, ces
prédicats, et c'est loin d'être le cas. Jusqu'à présent je n'ai réussi
à atteindre mon but qu'en utilisant unary_function< >, aussi me
demandais-je si predicate< > n'était tout simplement pas
implémentable ?

Les questions, donc :
a.) que signifie *exactement* le terme "Concept" dans la doc de la
stl ? A priori j'aurai dit que c'est un accord tacite sans code...
mais unary_function existe et je peux en hériter...


unary_function definit des typedefs. Il est de la forme:

template <class Arg, class Result>
struct unary_function
{
typedef Arg argument_type;
typedef Result result_type;
};


b.) est-ce que je peux utiliser un predicate<Point> ou ça n'existe pas
et j'ai donc raison d'utiliser unary_function<Point,bool> à la place ?


Tu as raison.

c.) s'il y a moyen d'utiliser predicate, j'imagine que c'est plus
propre, comment je fais ?


Tu peux le refaire:

template <class T_ARG>
struct predicate
{
typedef T_ARG argument_type;
typedef bool result_type;
};


Michael

Michael DOUBEZ
Le #379551
Bonjour, et merci pour cette réponse

Je n'ai pas vu de std::predicate dans la doc SGI.


Oui, moi non plus

Il y a le concept de Predicate mais, pour autant que je sache, il n'a


Tout à fait, mais je n'ai pas vu de std::unary_function non plus dans
la doc, je n'ai vu que le concept (ais-je mal cherché ?). Pourtant la
classe unary_function existe et se dérive. J'en avais inféré que
Predicate devait certainement aussi se dériver d'une manière ou d'une
autre.
Merci d'avoir confirmé que ce n'est pas le cas.


http://www.sgi.com/tech/stl/unary_function.html

"
Definition
Defined in the standard header functional, and in the nonstandard
backward-compatibility header function.h.
"

Donc c'est défini (ce qui n'est pas le cas de predicate).

D'une manière générale, la doc SGI ne correspond pas toujours au
standard. Il y a même une quantité de fonctor qui seraient bien utiles
mais bon ... c'est le comité qui décide.

Juste pour noter, dans un de tes mail précédents tu voulais utiliser
negate mais negate n'agit pas sur des prédicats, il réalise t->-t. Tu
doit vouloir arler de logical_not qui réalise b->!b.

Michael


meow
Le #379550
http://www.sgi.com/tech/stl/unary_function.html
... Forcément.

Je m'étais arrêté à la table of content
http://www.sgi.com/tech/stl/table_of_contents.html
à laquelle figure un certain nombre de types, mais pas ceux là...
Désolé. Et merci, je serai plus vigilant à l'avenir.

Juste pour noter, dans un de tes mail précédents tu voulais utiliser
negate mais negate n'agit pas sur des prédicats, il réalise t->-t. Tu
doit vouloir arler de logical_not qui réalise b->!b.


Je ne suis pas encore "pro" dans l'utilisation de ces fontionnalités
et j'écrivais de tête. Merci d'avoir corrigé. En fait, après
vérification, j'avais utilisé std::unary_negate.

--Ben

James Kanze
Le #1065392
On Jan 30, 3:11 pm, Michael DOUBEZ
[...]
Juste pour noter, dans un de tes mail précédents tu voulais
utiliser negate mais negate n'agit pas sur des prédicats, il
réalise t->-t. Tu doit vouloir arler de logical_not qui
réalise b->!b.


En général, on utiliserait plus souvent std::not1 ou std::not2,
je crois. Des fonctions qui renvoient un std::logical_not, mais
parce qu'elles sont des fonctions, la déduction automatique des
types se fait, et donc, on n'a pas besoin de les préciser
explicitement.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Publicité
Poster une réponse
Anonyme