2009-07-20 17 views

Respuesta

16

Para C++ no administrado con la misma sintaxis conveniente, no.

Pero existe soporte para variable argument lists para funciones en C++.

Básicamente usted declara una función con el último parámetro siendo un punto suspensivo (...), y dentro del cuerpo de la función utiliza las llamadas va_start()/va_arg() para analizar la lista de parámetros suministrados.

Este mecanismo no es de tipo seguro, y la persona que llama puede pasar nada, por lo que claramente debe documentar la interfaz pública de la función y lo que espera para ser aprobada en.

Para código administrado C++, véanse los comentarios de Reed .

19

Sí. En C++ estándar, puede usar va_arg y la ... sintaxis. Ver MSDN for details.

Para C++/CLI, hay un acceso directo para esto.

Esto se hace como:

void TheMethod(String^ firstArgument, ... array<Object^>^ variableArgs); 

Ver este blog post for details.

+0

Es bueno saber sobre eso ... no era consciente C++ tenía esta extensión para código administrado – LBushkin

+0

@LBushkin: actualizado con la mejor sintaxis. –

0

Hay una biblioteca named parameters en boost (si entiendo correctamente qué params en C# son). Permite escribir funciones como esta:

int y = lib::f(_name = "bob", _index = 2); 

No se puede decir nada sobre si hay una sobrecarga significativa involucrada.

+1

C# params no se llama params, son listas de argumentos de longitud variable. –

3

Hoy en día, con la moderna C++, puede utilizar prácticas modernas de seguridad de tipo para funciones variadas.

utilizar cualquiera de las plantillas variadic o std :: initializer_list si todos sus argumentos tienen el mismo tipo

Con plantilla variadic, que utilizar la recursividad para ir a través de una lista de parámetros variadic. Variadic plantilla de ejemplo:

template<class T> 
void MyFoo(T arg) 
{ 
    DoSomething(arg); 
} 
template<class T, class... R> 
void MyFoo(T arg, R... rest) 
{ 
    DoSomething(arg); 
    // If "rest" only has one argument, it will call the above function 
    // Otherwise, it will call this function again, with the first argument 
    // from "rest" becoming "arg" 
    MyFoo(rest...); 
} 

int main() 
{ 
    MyFoo(2, 5.f, 'a'); 
} 

Esto garantiza que si HacerAlgo, o cualquier otro tipo de código se ejecuta antes de que la llamada recursiva a myFoo, tiene una sobrecarga para el tipo de cada argumento que se pasa a la myFoo función, que la sobrecarga exacta ser llamado.

Con std :: initializer_list, se utiliza un simple bucle foreach que pasar por los argumentos

template<class T> 
void MyFoo(std::initializer_list<T> args) 
{ 
    for(auto&& arg : args) 
    { 
     DoSomething(arg); 
    } 
} 
int main() 
{ 
    MyFoo({2, 4, 5, 8, 1, 0}); // All the arguments have to have the same type 
} 
+0

Cabe destacar que también puede combinar 'static_assert' y plantillas variadic para hacer su propia lista flexible de inicializadores. F.ex. puede combinar 'std :: is_base_of' con static_assert en' T' en su ejemplo para asegurarse de que todos los tipos sean derivados de una cierta clase base. – atlaste

Cuestiones relacionadas