Soy más nuevo en C++, y mi primer idioma es el chino, por lo que mis palabras en inglés pueden ser irrelevantes, por ejemplo, lo siento primero. Sé que hay una forma de escribir una función con parámetros variables, cuyo número o tipo puede ser diferente para cada llamada, podemos usar las macros de va_list, va_start y va_end. Pero como todos saben, es el estilo C. Cuando usemos las macros, perderemos el beneficio de type-safe y auto-inference, entonces intento hacerlo con la plantilla de C++. Mi trabajo es seguido:función de parámetro variable, cómo hacer que el tipo sea seguro y más significativo?
#include<iostream>
#include<vector>
#include<boost/any.hpp>
struct Argument
{
typedef boost::bad_any_cast bad_cast;
template<typename Type>
Argument& operator,(const Type& v)
{
boost::any a(v);
_args.push_back(a);
return *this;
}
size_t size() const
{
return _args.size();
}
template<typename Type>
Type value(size_t n) const
{
return boost::any_cast<Type>(_args[n]);
}
template<typename Type>
const Type* piont(size_t n) const
{
return boost::any_cast<Type>(&_args[n]);
}
private:
std::vector<boost::any> _args;
};
int sum(const Argument& arg)
{
int sum=0;
for(size_t s=0; s<arg.size(); ++s)
{
sum += arg.value<int>(s);
}
return sum;
}
int main()
{
std::cout << sum((Argument(), 1, 3, 4, 5)) << std::endl;
return 0;
}
creo que es feo, quiero que hay una manera de hacerlo mejor? Gracias, y perdón por los errores de lenguaje.
Qué función (s) se necesita para hacer que necesitan Var- args y tipo de seguridad? – strager
es la cantidad de argumentos verdaderamente "cualquier cosa" o es algo práctico como "hasta 10"? –
Si los valores son correctos en tiempo de compilación, puede usar algún tipo de tupla para almacenarlos. Algunos template-meta magic pueden hacer que el objeto tuple sea bastante conveniente de crear. Sin embargo, si el código resultante es menos feo es, erm, _subjective_. Pero definitivamente es más rápido en tiempo de ejecución. ':)' – sbi