Constructeur à nombre variable d'arguments [Résolu]

Signaler
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
-
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
-
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

Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
1
Pour pouvoir passer des arguments de types différents.
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
1
Tu es bien certain ? Dans le cas de printf, par exemple, on peut passer des arguments de types différents...
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
1
OK, merci ! Je vais jeter un œil à ca.