2010-02-12 6 views
0

J'essaie de changer les valeurs entières d'un vecteur en utilisant transform et une structure de contrôle if_then_else de Boost Lambda. Cependant mon compilateur n'apprécie pas mes efforts. Le code que je tentais est:Transformation C++ avec structure de contrôle if_then_else

transform(theVec.begin(), theVec.end(), theVec.begin(), 
      if_then_else(bind(rand) % ratio == 0, _1 = bind(rand) % maxSize, _1)); 

J'ai essayé de simplifier à ce qui suit:

transform(theVec.begin(), theVec.end(), theVec.begin(), 
      if_then_else(0 == 0, _1 = MaxIntSizeCFG, _1)); 

mais le compilateur me dit: pas de fonction concordante pour appel à « If_Then_Else (...... .... » je lis que les valeurs de retour des structures de contrôle est vide, donc est mon utilisation tentative dans ce cas tout à fait tort?

Merci d'avance pour votre temps!

Répondre

1

if_then_else dans votre utilisation est incorrecte, de la même manière que c'est:

int i = if (some_condition){ 0; } else { 1; }; 

Ce que vous voulez est simplement l'opérateur ternaire; Cependant, cela ne fonctionnera pas dans un lambda. Vous pouvez simuler ceci avec la structure if_then_else_return à la place. (C'est-à-dire, vous étiez proche!)

Le if_then_else est pour quelque chose comme une boucle for_each, où vous prendriez une action ou l'autre en fonction d'une condition. Le if_then_else_return est pour une condition ternaire.

+0

Ah oui bien sûr, rien n'est renvoyé avec la structure if_the_else. J'ai essayé: transformer (theVec.begin(), theVec.end(), theVec.begin(), if_then_else_return (lier (rand)% ratio == 0, _1 = lier (rand)% maxSize, _1)) ; et cela a bien fonctionné. Merci! – Demps

+0

Pas de problème, j'attends votre prochaine question lambda. : P – GManNickG

+0

Haha, sa file d'attente! En fait pouvez-vous recommander une bonne ressource pour l'expression de lambada? Je viens juste de commencer à les utiliser (comme vous pouvez le dire) et je suis très impressionné par ce qui peut être fait. – Demps

1

Puisque vous utilisez déjà Boost je recommande BOOST_FOREACH au lieu d'une expression complexe lambda:

BOOST_FOREACH(int & i, v) 
    i = rand() % ratio ? i : rand(); 

Ce sera très facile d'adapter une fois que la nouvelle base gamme pour la boucle devient disponible:

for(int & i : v) 
    i = rand() % ratio ? i : rand(); 
+0

existe-t-il déjà des compilateurs qui permettent la seconde syntaxe pour un usage expérimental? –

+0

@rjones - Concept GCC le supporte depuis 2007 (!) Http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2196.html. Les principaux compilateurs prennent plus de temps en raison de la suppression des concepts de la prochaine norme – Manuel