2016-06-17 3 views
2

Ich stieß auf den folgenden Anwendungsfall, aber ich konnte keine richtige Lösung finden. Gibt es eine Möglichkeit, die Zeichenfolge "<" oder ">" durch die Bedingung < oder > in einem Zustand if zu ersetzen?Gibt es eine Möglichkeit, String ">" durch> in einem 'Wenn'-Zustand zu ersetzen?

Beispiel:

string condition = "<"; 
    if (10 condition 8) // Here I want to replace condition with < 
    { 
     // Some code 
    } 

Ich will nicht, es zu tun:

if ("<" == condition) 
{ 
    if (10 < 8) 
    { 
    } 
} 
else if (">" == condition) 
{ 
    if (10 > 10) 
    { 
    } 
} 

Und mein Zustand wird während der Laufzeit ändern. Ich suche nur nach einem einfachen Weg, wenn es abgesehen von oben existiert.

Anwendungsfall: Der Benutzer wird eine Abfrage wie unten geben:

input: 10 > 9 => output: true 
input: 10 < 7 => output: false 

Grundsätzlich muss ich diese Abfrage analysieren, wie ich diese 3 Worte (10,>, 9) als Strings, und irgendwie habe ich möchte die Zeichenfolge ">" oder "<" in das tatsächliche Symbol > oder < konvertieren.

+1

Nein. Beachten Sie auch, dass "Zeichenfolge" kein C-Typ ist. –

+0

Sie können '#define lessThan <' eingeben und dann 'if (10 lessThan 8)' schreiben. Dies ist wahrscheinlich nutzlos, aber Sie haben auch keinen tatsächlichen Anwendungsfall erwähnt. – melpomene

+0

@melpomene Ihr Vorschlag ist irrelevant, da 'lessthen' nur der Bezeichnername ist, den er für den Operanden verwendet ... ' # define' führt zur Vorkompilierungszeit und ändert sich nicht zwischen den Läufen. –

Antwort

5

Sie können die Zeichenfolge einem Standardbibliothek-Komparator-Funktor wie std::less über eine std::map oder std::unordered_map zuordnen.

+0

Ja, aber dies beinhaltet die Verwendung des Präprozessors, so dass Sie den Wert einer Zeichenfolge nicht als dynamisch gesetzten Operator wie im Beispiel des Fragestellers verwenden können. Dies ist jedoch eine interessante Strategie, da dies die Lesbarkeit etwas verbessern könnte. –

+3

Der Präprozessor muss dafür nicht verwendet werden. – Peter

+4

@RobertColumbia: Entschuldigung, ich verstehe nicht, wie Sie zu Ihrer Schlussfolgerung kommen. Es gibt keinen Präprozessor. –

5

Sie können in C++ keinen neuen Operator erstellen (Can I create a new operator in C++ and how?). Ich kann mit dieser Idee sehen, woher du kommst, aber die Sprache unterstützt das nicht. Sie können jedoch eine Funktion erstellen, die zwei Operanden und eine Zeichenfolge "Argument" verwendet und den entsprechenden Wert zurückgibt. Auch

bool CustomCompare(int operand1, int operand2, string op) 
{ 
    if (op == "<") 
    { 
     return operand1<operand2; 
    } 
    if (op == ">") 
    { 
     return operand1>operand2; 
    } 
    if (op == "_") 
    { 
     return DoTheHokeyPokeyAndTurnTheOperandsAround(operand1, operand2); 
    } 
} 
+0

Wie ich gesagt habe, habe ich darüber nachgedacht, aber schauen, ob es einen anderen Weg gibt. genau wie Token-Operatoren – NDestiny

0

Wenn Sie ein C++ Ninja sind, und Sie sind sehr hartnäckig, um es einfach in die Quere Arbeits Wünsche, es gibt einen Weg, aber es ist fortgeschritten und kompliziert.

Ich schreibe meistens POSIX Code für VxWorks, aber ich denke, es kann für andere getan werden.

Sagen wir, Sie haben: string myExpression = "mySize > minSize";

  1. "Erstellen Sie den String als C-Code" (Datei speichern, verwenden Sie ccppc, gcc, gpp, was Werkzeugkette Sie haben.)
  2. Sie müssen verlinken es mit Ihrem Code, zumindest ELF Verlagerungen zu erhalten für mySize & minSize (ich glaube, es mit App-Belastung durchgeführt werden kann, wenn Sie Ihr ld Befehl anpassen.
  3. laden den Codemit
  4. Wechseln Sie zu der neuen Adresse, in die Sie Ihren Code geladen haben.

Alles, was gesagt, würde ich empfehlen Ihnen, dass Sie nicht zu tun:

  1. Sehr kompliziert.
  2. Nicht die stabilste und sehr Bug/Fehler anfällig.
  3. Kann zu großen Schwachstellen führen "Hacker" -Stil, und ordnungsgemäße Hygiene ist erforderlich.

Der einzige Profi ich sehen kann, ist, dass diese Methode alles C unterstützt aus der Box zu bieten hat! BitWise, + -/*^!, funktioniert sogar als pow(), und so weiter.

Ein wenig besser ist:

`"bool comparer_AB(int a, int b) { return a " + operator + "}"` 

und dann comparer_AB(); nennen:

eine Funktion als kompilieren.

0
#include <functional> 
#include <map> 
#include <string> 

int main() 
{ 
    using operation = std::function<bool(int,int)>; 
    std::map<std::string, operation> mp = 
    {{"<", std::less<int>()}, 
    {">", std::greater<int>()}}; 

    int x = 5; 
    int y = 10; 
    std::string op = "<"; 

    bool answer = mp[op](x, y); 
} 
Verwandte Themen