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

12voto

Georg Fritzsche Punkte 95256

Ein Beispiel mit einer Standardbibliothek Funktor :

#include <functional>

template<class UnaryPred> void func(int& num, UnaryPred predicate) {
    while(!predicate(num)) num = std::rand();
}

void test() {
    int i = 0;
    func(i, std::bind1st(std::greater<int>(), 3));
}

Siehe die Dokumentation zu <functional> für das, was Ihnen C++ bereits von Haus aus bietet.

Wenn Ihr Compiler eine ausreichende Unterstützung bietet (z.B. GCC 4.5 oder VC10), können Sie sich auch für Lambda-Funktionen . Z.B. unter Verwendung der gleichen func() wie oben:

func(i, [](int num) { return num > 3; });

3voto

Anycorn Punkte 48423

Dies wird als funktionale Programmierung bezeichnet.

Hier ist ein Schnipsel mit boost::phoenix http://www.boost.org/doc/libs/1_43_0/libs/spirit/phoenix/doc/html/phoenix/starter_kit.html :

using namespace boost::phoenix;

Foo(x, (cref(x) < 3));
// (cref(x) < 3) is expression that creates function object

template<class C> // condition is a monster, make it generic
void Foo(int &num, C condition)
{
    while(!condition()) // notice you call condition as function
    {
        rand(num);
    }
}

2voto

user11977 Punkte 1763

Sie sollten eine Funktion erstellen, die Ihre Bedingung testet, und dann einen Zeiger auf diese Funktion als Parameter übergeben. Siehe http://www.cprogramming.com/tutorial/function-pointers.html für Details/Übungen, wie man das macht.

2voto

Jonathan Leffler Punkte 694013

Der plausible Weg, dies zu tun, würde einen Funktor - und ein Objekt, das sich wie eine Funktion verhält - an die aufgerufene Funktion übergeben, und die aufgerufene Funktion würde den Funktor aufrufen, um die Bedingung bei jeder Iteration der Schleife neu zu bewerten.

Das Parsen der Zeichenkette wird nicht funktionieren; die aufgerufene Funktion hat keinen Zugriff auf die lokalen Variablen der aufrufenden Funktion.

1voto

Daniel Egeberg Punkte 8299

Übergeben Sie eine Funktion an Foo stattdessen. Dann können Sie die Ausführung des Ausdrucks "verzögern", indem Sie mit dem Aufruf dieser Funktion warten.

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