2010-03-07 17 views
7

¿es posible construir argumentos variados para la función sobrecargando la coma del operador del argumento? Quiero ver un ejemplo de cómo hacerlo ..., tal vez algo como esto:C++ que sobrecarga la coma del operador para los argumentos variad

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

¿Por qué necesita hacer usando el operador de coma? P.ej. Boost.Assign ya te da una sintaxis ordenada, pero usa 'operator()'. –

+0

porque quiero el uso tan simple como MyFunction (1,2,3) no MyFunction (boost :: list_of (1) (2) (3)) – uray

Respuesta

11

Es Sort- de posible, pero el uso no se verá muy bien. Para 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)); 
} 

Esta deficiencia se fijará en C++ 0x donde se puede hacer:

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 incluso con tipos mixtos:

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

eso está bien, ¿está en TR1? – uray

+0

initializer_list? No estoy seguro ya que necesita el soporte integrado del lenguaje para funcionar. Pero ambos fragmentos ya compilan con GCC 4.4.1 con std = C++ 0x – UncleBens

+0

podemos tener una coma de operador global sobrecargada estática como: 'plantilla T & operator, (const T & a, T & b);'? – uray

1

Los operadores tienen un número fijo de parámetros. No puedes cambiar eso. El operador de coma toma dos argumentos. Entonces no Sin embargo, puede rodar una versión personalizada en cascada, con cierto esfuerzo.

+0

El operador de coma toma un argumento. – StilesCrisis

+0

@StilesCrisis El operador de coma realmente puede tomar uno o dos argumentos. Usando dos args, especifica que la coma puede aparecer antes del operando y después de otro tipo. Es incluso menos común que la sobrecarga de coma de un punto común, que ya es bastante raro, pero existe. –

0

No, no lo es. La lista de valores separados por el operador de coma se evaluará como un valor único. Por ejemplo:

1,2,3 

resultará en un único valor, 3.

+2

eso es lo que quiero, la función aún recibe un valor único, pero ese valor fue construido por la coma del operador, veo que era posible hacer el objeto MyObject = (1,2,3), pensé que era posible modificarlo a trabajar con MyObject como argumento de la función – uray

+0

@uray Lo siento, eso no está del todo claro. Por favor, modifique su pregunta para ilustrar lo que quiere hacer. Por ejemplo, ¿cuáles son los tipos de a, b, c y d en su código de ejemplo? Recuerde, no puede sobrecargar operadores para los tipos "incorporados". –

+0

@neil: he editado mi pregunta – uray

1

Tal vez algo como esto:

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 sería:

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