2010-03-07 31 views
7

è possibile costruire argomenti variadici per funzione sovraccaricando l'operatore virgola dell'argomento? voglio vedere un esempio di come farlo .., forse qualcosa di simile:Operatore di overload C++ virgola per argomenti variadici

template <typename T> class ArgList { 
public: 
    ArgList(const T& a); 
    ArgList<T>& operator,(const T& a,const T& b); 
} 
//declaration 
void myFunction(ArgList<int> list); 

//in use: 
myFunction(1,2,3,4); 

//or maybe: 
myFunction(ArgList<int>(1),2,3,4); 
+0

perché avete bisogno di fare usando l'operatore virgola? Per esempio. Boost.Assign offre già una sintassi precisa, ma usa 'operator()'. –

+0

perché voglio l'utilizzo semplice come MyFunction (1,2,3) non MyFunction (boost :: list_of (1) (2) (3)) – uray

risposta

11

E 'sort- di possibile, ma l'utilizzo non sarà molto bello. Per exxample:

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 

template <class T> 
class list_of 
{ 
    std::vector<T> data; 
public: 
    typedef typename std::vector<T>::const_iterator const_iterator; 
    const_iterator begin() const { return data.begin(); } 
    const_iterator end() const { return data.end(); } 

    list_of& operator, (const T& t) { 
     data.push_back(t); 
     return *this; 
    } 
}; 

void print(const list_of<int>& args) 
{ 
    std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

int main() 
{ 
    print((list_of<int>(), 1, 2, 3, 4, 5)); 
} 

Questa lacuna verrà risolto in C++ 0x, dove si può fare:

void print(const std::initializer_list<int>& args) 
{ 
    std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

int main() 
{ 
    print({1, 2, 3, 4, 5}); 
} 

o anche con tipi misti:

template <class T> 
void print(const T& t) 
{ 
    std::cout << t; 
} 

template <class Arg1, class ...ArgN> 
void print(const Arg1& a1, const ArgN& ...an) 
{ 
    std::cout << a1 << ' '; 
    print(an...); 
} 


int main() 
{ 
    print(1, 2.4, 'u', "hello world"); 
} 
+0

è bello, è in TR1? – uray

+0

initializer_list? Non sono sicuro poiché ha bisogno del supporto integrato della lingua per funzionare. Ma entrambi gli snippet sono già compilati con GCC 4.4.1 con std = C++ 0x – UncleBens

+0

possiamo avere un operatore di overload statico globale come virgola: 'modello T & operatore, (const T & a, T & b);'? – uray

1

Gli operatori hanno un numero fisso di parametri. Non puoi cambiarlo. L'operatore virgola accetta due argomenti. Quindi no. Tuttavia, è possibile eseguire il rollover di una versione personalizzata a cascata con un certo sforzo.

+0

L'operatore virgola accetta un argomento. – StilesCrisis

+0

@StilesCrisis L'operatore virgola può effettivamente assumere uno o due argomenti. Usando due argomenti, si specifica che la virgola può apparire prima dell'operando e dopo un altro tipo. È anche meno comune del normale sovraccarico di una virgola, che è già piuttosto raro, ma esiste. –

0

No, non lo è. L'elenco di valori separati dall'operatore virgola verrà valutato come un singolo valore. Per esempio:

1,2,3 

si tradurrà in un unico valore, 3.

+2

è quello che voglio, la funzione riceve ancora un singolo valore, ma quel valore è stato costruito dall'operatore virgola, vedo che era possibile fare oggetto MyObject = (1,2,3), ho pensato che fosse possibile modificarlo in lavorare con MyObject come argomento di funzione – uray

+0

@uray Scusa, non è chiaro. Ti preghiamo di modificare la tua domanda per illustrare cosa vuoi fare. Ad esempio, quali sono i tipi di a, b, c, d nel codice di esempio? Ricorda, non puoi sovraccaricare gli operatori per i tipi "integrati". –

+0

@neil: ho modificato la mia domanda – uray

1

Forse qualcosa di simile:

class MyArgList { 
public: 
    typedef std::list<boost::any> ManyList; 

    template <typename T> 
    MyArgList& operator, (const T& val) { 
     elems.push_back(val); 
     return *this; 
    } 

    ManyList::iterator begin() {return elems.begin();} 
     ... 

private: 
    ManyList elems; 
}; 

Uso sarebbe:

void foo(MyArgList& list); 
foo((myArgList(),1,2,3,4,5)); 
Problemi correlati