5 Stimmen

Übergabe der Bedingung als Parameter

Zunächst einmal möchte ich erklären, was ich zu tun versuche:

void Foo(int &num, bool condition);

Foo(x, x > 3);

Dieser Code würde im Grunde das bool der Bedingung auswerten, bevor er die Funktion aufruft, und dann reines true oder false übergeben. Ich bin auf der Suche nach einem Weg, um es passieren die Bedingung selbst, so könnte ich so etwas wie dieses tun:

void Foo(int &num, bool condition)
{
    while(!condition)
    {
        num = std::rand();
    }
}

Ich weiß, dass es eine Umgehung geben könnte, indem man eine Zeichenkette mit der Bedingung übergibt und letztere analysiert, und ich arbeite gerade daran, aber ich finde diese Methode ziemlich ineffizient. Die akzeptierte Antwort wird diejenige sein, die die Lösung auf einem anderen Weg neben dem mit dem Parsen des Strings, der die Bedingung enthält, erklärt, oder eine Antwort, die klarstellt, dass dieser Weg der Übergabe von Bedingungen unmöglich ist.

Vielen Dank im Voraus

1voto

Remy Lebeau Punkte 498719

Wie andere bereits gesagt haben, übergeben Sie ein Funktor-Objekt an Foo(). Die STL verwendet diesen Ansatz üblicherweise. Zum Beispiel:

template< class Func >
void Foo(int &num, Func condition) 
{ 
    while(!condition()) 
    { 
        rand(num); 
    } 
} 

struct GreaterThanThree
{
    int& _num;
    GreaterThanThree(int &num) : _num(num) {}
    bool operator()() const { return (_num > 3); }
};

Foo(x, GreaterThanThree(x));

1voto

egrunin Punkte 23979

Sie können dies ohne Templates oder Boost tun (ein Kommentator bezeichnete dies als "C-Stil", was wohl richtig ist).

/* have Foo take a pointer to a function that returns bool */
void Foo(int &num, bool (*fcn)(int))
{
    while(!fcn(num))
    {
        num = std::rand();
    }
}

/* You can have all the Comparators you want, 
   as long as they have the same signature */
bool ComparatorOne(int x) { return x > 3 ? true : false; }

bool ComparatorTwo(int x) { return x < 10 ? true : false; }

/* and this is how you call it */
int n;
Foo(n, ComparatorOne);
Foo(n, ComparatorTwo);

Editar

Beachten Sie, dass Ihr Comparator einen anderen Satz von Parametern annehmen kann, solange sie konsistent sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X