Vous pouvez utiliser C++ 0xauto
mot-clé avec spécialisation de modèle sur par exemple une fonction nommée boost::make_array()
(similaire à make_pair()
). Pour le cas où N
est 1 ou 2 arguments on peut alors écrire variante A comme
namespace boost
{
/*! Construct Array from @p a. */
template <typename T>
boost::array<T,1> make_array(const T & a)
{
return boost::array<T,2> ({{ a }});
}
/*! Construct Array from @p a, @p b. */
template <typename T>
boost::array<T,2> make_array(const T & a, const T & b)
{
return boost::array<T,2> ({{ a, b }});
}
}
et variante B comme
namespace boost {
/*! Construct Array from @p a. */
template <typename T>
boost::array<T,1> make_array(const T & a)
{
boost::array<T,1> x;
x[0] = a;
return x;
}
/*! Construct Array from @p a, @p b. */
template <typename T>
boost::array<T,2> make_array(const T & a, const T & b)
{
boost::array<T,2> x;
x[0] = a;
x[1] = b;
return x;
}
}
GCC-4,6 avec -std=gnu++0x
et -O3
génère le exactement le même code binaire pour
auto x = boost::make_array(1,2);
utilisant à la fois A et B comme pour
boost::array<int, 2> x = {{1,2}};
Pour types définis par l'utilisateur (UDT), cependant, les résultats variante B dans un constructeur de copie supplémentaire, qui habituellement ralentir les choses, et devrait donc être évitée.
Notez que boost::make_array
erreurs lors de l'appel avec un tableau explicite char littéraux comme dans le cas suivant
auto x = boost::make_array("a","b");
Je crois que c'est une bonne chose que const char*
littéraux peut être trompeur dans leur utilisation.
modèles VARIADIC, disponibles dans GCC depuis 4.5, peut encore être utilisé de réduire tout le code-plaque de la chaudière spécialisation de modèle pour chaque N
dans une définition de modèle unique de boost::make_array()
défini comme
/*! Construct Array from @p a, @p b. */
template <typename T, typename ... R>
boost::array<T,1+sizeof...(R)> make_array(T a, const R & ... b)
{
return boost::array<T,1+sizeof...(R)>({{ a, b... }});
}
Cela fonctionne à peu près comme nous l'espérons. Le premier argument détermine boost::array
l'argument modèle T
et tous les autres arguments sont convertis en T
. Dans certains cas, cela peut ne pas être souhaitable, mais je ne suis pas sûr de savoir si cela est possible de spécifier en utilisant des modèles variadiques.
Peut-être boost::make_array()
devrait aller dans les bibliothèques Boost?
Vos classes ne sont pas parce que tout est à bâtir 'private'. –
(accès aux mots-clés laissés pour la simplicité pédagogique) –
Ne serait-il pas plus facile d'utiliser 'struct' à la place de' class' pour la simplicité pédagogique? Je trouve le code qui compile plus facile à apprendre à partir de ;-) –