Je suis un nouveau pour C++, et ma première langue est le chinois, donc mes mots avec l'anglais peuvent être sans intérêt, dis désolé d'abord. Je sais qu'il existe un moyen d'écrire une fonction avec des paramètres variables dont le nombre ou le type peut être différent à chaque appel, on peut utiliser les macros de va_list, va_start et va_end. Mais comme tout le monde le sait, c'est le style C. Lorsque nous utiliserons les macros, nous perdrons le bénéfice de la sécurité de type et de l'auto-inférence, alors j'essaie de le faire avec le template C++. Mon travail est suivi:fonction de paramètre variable, comment rendre le type sûr et plus significatif?
#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;
}
Je pense qu'il est laid, je veux y est un moyen de faire mieux? Merci, et désolé pour les erreurs de langue.
Quelle fonction (s) avez-vous besoin de faire qui ont besoin var- arguments et type de sécurité? – strager
est le nombre d'arguments vraiment "quelque chose" ou est-ce quelque chose de pratique comme "jusqu'à 10"? –
Si les valeurs sont fix au moment de la compilation, vous pouvez utiliser un certain type de tuple pour les stocker. Un peu de magie de template-meta pourrait rendre l'objet tuple très pratique à créer. Si le code résultant est moins laid est, erm, _subjective, cependant. Mais c'est définitivement plus rapide à l'exécution. ':)' – sbi