2009-06-14 11 views
1

Je travaille à rendre une classe d'expression:Comment faire une variable "opérateur"? (C++)

template<typename T, typename U> 
class expression 
{ 
public: 
    expression(T vala, U valb, oper o){val1 = vala; val2 = valb; op = o;} 
    operator bool{return(val1 op val2);} 
private: 
    T val1; 
    U val2; 
    oper op; 
}; 

comme vous pouvez le voir, c'est un peu pseudocode, parce que je besoin d'une classe d'opérateur. Ma pensée originale était de créer un tableau de tous les opérateurs possibles, puis le convertir en une chaîne, mais cela ne fonctionnerait pas en raison du nombre d'opérateurs, et comment le convertir en une chaîne, sauf à travers un tableau bidimensionnel, où n [0] [0] a le premier opérateur, et n [0] [1] a cette chaîne d'opérateurs.

Est-ce que quelqu'un a des suggestions pour ajouter une valeur d'opérateur à ma classe d'expression?

Répondre

2

Peut-être un pointeur de fonction. Au lieu de ...

operator bool{return(val1 op val2);} 

... Code comme ...

operator bool{return op(val1, val2);} 

... auquel cas op peut être un pointeur vers une fonction (any) qui prend deux paramètres et ce qui retourne bool.

template<typename T, typename U> 
class expression 
{ 
public: 
    //define pointer-to-function type 
    typedef bool *oper(const T& val1, const U& val2); 
    ... etc ... 
+0

Pourquoi avez-vous utilisé typedef? –

+0

J'ai utilisé typedef pour définir quel est le type 'oper', que l'OP passe comme paameter au constructeur d'expression: Je dis que c'est un pointeur sur une fonction, qui prend deux paramètres et retourne bool. – ChrisW

1

Je ne suis pas entièrement sûr de ce que vous demandez, mais si vous essayez de surcharger une chaîne arbitraire en tant qu'opérateur, vous ne pouvez pas. Il existe un ensemble fini d'opérateurs que vous pouvez surcharger en C++

voir ici: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Ce que vous devez faire est l'opérateur de surcharge() en fonct pour créer un objet de fonction et retourner op (val1, val2) au lieu .

2

Des méthodes similaires sont utilisées dans les templates d'expression C++ techniqueue.

Vous créez une expression en classe avec une méthode telle que apply ou evaluate. Cette méthode prend les paramètres et applique l'expression.

Regardez ce que les modèles d'expression utilisent. http://www.angelikalanger.com/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm http://ubiety.uwaterloo.ca/~tveldhui/papers/Expression-Templates/exprtmpl.html

À titre d'exemple dans votre cas:

struct isEqual 
{ 
    template <typename T, typename U> 
    bool operator()(T a, U b) 
    { 
     return a == b; 
    } 
}; 

template <typename T, typename OP> 
struct expression 
{ 
    T& a; 
    T& b; 
    OP& op; 

    expression(T a, T b, OP op) : a(a), b(b), op(op) {} 

    void eval() { op(a,b); } 
}; 


int main() 
{ 
    expression<int, isEqual> exp(1,2,isEqual()); 
    exp.eval(); 
} 
1

Vous pouvez utiliser la bibliothèque standard fonctionnelle et de prendre vos arguments comme:

std::tr1::function<bool (T,U)> 

-à-dire:

#include <functional> 

template<typename T, typename U> 
class expression 
{ 
public: 
    expression(T vala, U valb, oper o) : val1(vala), val2(valb), op(o) 
    { } 
    operator bool{return op(val1, val2);} 
private: 
    T val1; 
    U val2; 
    std::tr1::function<bool (T,U)> op; 
}; 

Th en, pour créer une expression:

#include <functional> 

expression<int, int> foo(4,3, std::tr1::bind(greater())); 

Voici un tutorial

Questions connexes