2013-08-16 5 views
3

Existe-t-il un moyen de surcharger un opérateur (en particulier, operator >>) en tant que pointeur de fonction, puis lui affecter une fonction lors de l'exécution? Je veux être capable de regarder un fichier à l'exécution pour déterminer le format du fichier, puis affecter le bon pointeur de fonction à l'opérateur pour le faire fonctionner comme désiré. J'attribuerais la fonction correcte au constructeur, avant que l'opérateur ne soit appelé. Je me rends compte qu'il existe d'autres moyens (peut-être plus faciles) de faire la même chose, mais je me demande si c'est possible.Rendre un opérateur surchargé en C++ un pointeur de fonction

Voici ce que j'ai essayé:

bool Flag; // In global scope - set in main() 

class MyClass 
{ 
private: 
    int data; 
    friend istream & function1(istream & in, MyClass & c); 
    friend istream & function2(istream & in, MyClass & c); 
public: 
    MyClass() :data(0) {operator>>=((Flag)?&function1:&function2);} 
    friend istream& (*operator>>)(istream & in, C & c); 
}; 

// function1 and function2 definitions go here 

int main (int argc, char **argv) 
{ 
    if (argc > 2) 
     Flag = ((atoi(argv[1]) > 1) ? 1 : 0); 
    MyClass mcInstance; 
    ifstream in(argv[2]); 
    in >> mcInstance; 
    return 0; 
} 

je reçois une erreur qui ressemble à ceci:

error: declaration of ‘operator>>’ as non-function

+0

double possible de [ Est-il possible d'obtenir le pointeur de fonction d'un opérateur standard intégré?] (Http://stackoverflow.com/questions/17644816/is-it-possible-to-get-the-function-pointer-of-a- built-in-standard-operator) – aaronman

+0

Il suffit de faire en sorte que la fonction 'operator >>' regarde 'Flag' et modifie son comportement en conséquence. –

+0

Vous pouvez créer un pointeur de fonction vers un opérateur, mais il aura un nom normal à appeler. –

Répondre

0

Vous ne pouvez pas redéfinir le sens de toute fonction réelle, y compris les opérateurs, à run-time directement: les fonctions sont des entités immuables. Ce que vous pouvez faire, cependant, est de déléguer dans la fonction, y compris un opérateur défini par l'utilisateur, à une fonction différente en utilisant un pointeur sur une fonction. Par exemple:

std::istream& 
std::operator>> (std::istream& in, MyClass& object) { 
    return Flag? function1(in, object): function2(in, object); 
} 

Si vous souhaitez déléguer par un pointeur de fonction, par exemple, par objet, vous pouvez définir le pointeur de fonction dans votre objet et déléguer par ce qui suit:

class MyClass { 
    fried std::istream& operator>> (std::istream&, Myclass&); 
    std::istream& (*d_inputFunction)(std::istream&, MyClass&); 
public: 
    MyClass(): d_inputFunction(Flag? &function1: &function2) {} 
    // ... 
}; 
std::istream& operator>> (std::istream& in, MyClass& object) { 
    return (object.d_inputFunction)(in, object); 
} 
+0

Je pensais que c'était ce que je demandais ... –

+0

@ZackSheffield: Eh bien, je vous ai clairement demandé si vous pouvez attribuer en quelque sorte aux opérateurs de sortie. Il semble que vous voulez vraiment savoir comment surcharger l'opérateur d'entrée et faire à partir de là tout ce que vous devez faire. J'ai ajouté des exemples de cela peut être fait. –

Questions connexes