Constructeur à nombre variable d'arguments

Résolu
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 - 28 nov. 2010 à 11:26
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 - 29 nov. 2010 à 12:59
Bonjour à tous,

Est-il possible de créer un constructeur de classe avec un nombre variable d'arguments à l'aide de cstdarg ?
Merci pour vos réponses !

Exar

6 réponses

cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
29 nov. 2010 à 12:25
Si je ne m'abuse, normalement on ne peut mettre d'arguments de type différent dans une liste variable d'arguments.
Tu peux toujours faire un tableau de boost::variant ou boost::any.
Ou alors, "templaté" ton constructeur. Mais malheureusement, les templates variadics n'existent pas en C++. Donc je n'ai pas de "vraie" solution à te donner.

J'ai bien une solution, mais elle ne fonctionne qu'en C++0x.

Compilé avec "g++ -std=c++0x":
#include 
#include <cstdarg>
#include 

void printAny(std::ostream& out, const boost::any& value)
{
  if (typeid(float) == value.type())
    out << boost::any_cast<float>(value) << ", ";
  else if(typeid(int) == value.type())
    out << boost::any_cast(value) << ", ";
  else if (typeid(std::string) == value.type())
    out << boost::any_cast<std::string>(value) << ", ";
  else
    out << "Unknow type: " << value.type().name() << ", ";
}

template <typename... T>
class Test
{
public:
  Test(const T&... args)
  {
    const unsigned int size = sizeof...(T);
    boost::any array[size] = { args... };

    for (unsigned int i = 0; i < size; ++i)
      printAny(std::cout, array[i]);
    std::cout << std::endl;
  }
  ~Test()
  {
  }
};

int main()
{
  std::cout << "Test" << std::endl;

  Test<>();
  Test(547);
  Test(4, 6);
  Test(true);
  Test(18, "Kikoo");

  Test
    (4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17);

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
29 nov. 2010 à 12:49
Il me semble que c'est mis dans un conteneur invariant, et qu'il faille ensuite préciser le type (dans le format du printf). Je n'en suis pas sur à 100%.

Néanmoins, je suis sur à 100% qu'il est impossible de faire un constructeur à nombre d'argument variable en C++. (Possible en C++0x).
Si tu regardes le code source de boost::tuple, tu verras qu'ils écrivent une dizaine de constructeurs à la main.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
28 nov. 2010 à 18:24
Il me semble que c'est possible: http://www.codeguru.com/forum/showthread.php?t=274909

Néanmoins, pourquoi ne pas passer un tableau comme argument de ton constructeur ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 2
28 nov. 2010 à 18:52
Pour pouvoir passer des arguments de types différents.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 2
29 nov. 2010 à 12:34
Tu es bien certain ? Dans le cas de printf, par exemple, on peut passer des arguments de types différents...
0
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 2
29 nov. 2010 à 12:59
OK, merci ! Je vais jeter un œil à ca.
0