Sono un neofita per C++ e la mia lingua madre è il cinese, quindi le mie parole con l'inglese potrebbero essere scomode, per prima cosa scusate. So che c'è un modo per scrivere una funzione con parametri variabili che numero o tipo può essere diverso per ogni chiamata, possiamo usare i macro di va_list, va_start e va_end. Ma come tutti sanno, è lo stile C. Quando usiamo i macro, perderemo il beneficio di type-safe e auto-inferenza, quindi cerco di farlo con il modello C++. Il mio lavoro è seguito:funzione di parametro variabile, come renderlo sicuro e più 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;
}
penso che sia brutto, voglio ci sia un modo per fare di meglio? Grazie, e mi dispiace per gli errori di lingua.
Quale funzione (s) avete bisogno di fare che hanno bisogno di Var- args e type safety? – strager
è il numero di argomenti veramente "nulla" o è qualcosa di pratico come "fino a 10"? –
Se i valori sono corretti in fase di compilazione, è possibile utilizzare un tipo di tupla per memorizzarli. Alcune magie template-meta potrebbero rendere l'oggetto tuple piuttosto comodo da creare. Se il codice risultante è meno brutto è, erm, _soggettivo_, però. Ma è decisamente più veloce in fase di esecuzione. ':)' – sbi