2009-09-07 25 views
8

E 'possibile sovraccaricare gli operatori di classe C++ nel contesto statico? per esempio.Sovraccarico operatore statico C++

class Class_1{ ... } 
int main() 
{ 

    Class_1[val]... 

} 
+0

Qualora 'Class_1 [val]' resa un genere? Come ti aspetti di fare 'Class_1 [val] v;'? –

+1

Stavo per farlo produrre valori integrali ma i tipi vanno bene. – jameszhao00

+0

In C++, i tipi non possono essere rappresentati nel sistema di tipi (c'è solo 'std :: type_id') e non riesco a pensare ad alcun operatore che possa essere sovraccaricato staticamente. Suggerisco, invece di chiedere se la tua idea di implementazione è fattibile in C++, di presentare il vero problema _problem_ che si pensava di risolvere. Qualcuno potrebbe essere in grado di suggerire un'implementazione fattibile. – sbi

risposta

13

Se si sta cercando metaprogramming utilizzando l'operatore integrato: Una cosa del genere non è possibile - gli operatori integrati operano su valori di runtime, non su valori di tempo di compilazione.

È possibile utilizzare boost::mpl per questo, e invece di usare gli operatori built-in, utilizzare i suoi modelli, come at per op[], plus<a, b> per op+ ecc

int main() { 
    using boost::mpl::vector; 
    using boost::mpl::at_c; 
    using boost::mpl::plus; 
    using boost::mpl::int_; 

    typedef vector<int, bool, char, float> Class_1; 
    typedef vector< int_<1>, int_<2> > Numeric_1; 

    at_c<Class_1, 0>::type six = 6; 
    typedef plus<at_c<Numeric_1, 0>::type 
       ,at_c<Numeric_1, 1>::type>::type r; 
    int i3[r::value] = { 4, 5, 6 }; 
    return ((i3[0] + i3[1] + i3[2]) * six) == 90; 
} 
3

Se si intende l'operatore opera su una classe, il No. Questo non ha senso, è come dire operator + possono operatore int o double. Gli operatori sono zucchero sintattico per le funzioni e operano su varibles (valori) non su tipi.

+1

Ha senso se si ha una sorta di classe di utilità - con solo membri statici - che carica qualcosa su "sé", che poi si desidera accedere nel modo più semplice - usando un operatore come '[]'. –

+1

Sì, aggiungendo al commento di @ jave.web: può certamente avere senso nei casi * quando ci sono dati nell'ambito statico * della classe. (Anche l'OP menziona esplicitamente lo scope statico.) Quindi, non con aritmetica semplice, come nel tuo esempio, ma cose come [],(), <<, >> ecc. Potrebbero essere lo zucchero sintattico perfetto per qualsiasi tipo di classi di manager complesse, anche , senza forzare un'istanza singleton. –

5

Non credo sia possibile, anche se potrei sbagliarmi su questo fronte. Vorrei chiedere perché vorresti farlo comunque. Anziché eseguire operazioni su una classe anziché su istanze, forse hai solo bisogno di un'istanza per tutta l'applicazione? In questo caso, probabilmente dovresti usare the singleton pattern.

+1

Ho usato il pattern Singleton come un matto, ma poi ho smesso perché il codice singleton è una seccatura per scrivere i test. – jameszhao00

1

No, gli operatori non possono essere membri statici di una classe. Utilizzare invece una funzione statica regolare.