Bonjour,
Je suis confronté a un problème que je pensai simple, et qui finalement ne semble pas l'être.
- Parcourir un boost::tuple de type et de taille inconnue.
En effet il n'y a pas d'iterateur, ni de BOOST_FOREACH, pour les tuple.
De plus il y a bien un accesseur par index, mais l'index doit être connue a la compilation.
Ma première idée été donc de faire quelque chose comme ceci:
Ce n'est pas très joli, et la taille du tuple est limité, mais je pensai qu'au moins ça marcherais.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #include <iostream> #include <boost/tuple/tuple.hpp> #include <boost/static_assert.hpp> using namespace std; using namespace boost; template<class T> void coutTuple(const T &myTuple) { static const int len = tuples::length<T>::value; //len est connu a la compilation BOOST_STATIC_ASSERT(len == 1); if(len > 0) { cout << myTuple.get<0>(); if(len > 1) //donc cette contition est fausse, puisque len == 1 { cout << myTuple.get<1>(); //Pourtant il y a quand meme une erreur ici if(len > 2) { cout << myTuple.get<2>(); //et ici //if(len > 3) etc... } } } } int main() { tuple<int> myTuple(21548); coutTuple(myTuple); return 0; }
Et bien non car le compilateur semble vouloir compiler les lignes dont il sait pertinemment qu'elle ne seront jamais exécutées. Ce qui me surprend un peu.
En poussant un peu le bouchon j'ai testé ça:
Le problème reste exactement le même. Ce qui veux dire que mon compilo tente d'instancier coutTuple<tuple<int> > alors qu'il sait bien que cette fonction ne sera jamais appelé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int main() { if(false) { tuple<int> myTuple(21548); coutTuple(myTuple); } return 0; }
(Je suis sur minGW 5.1.4, et le problème semble indépendant des option de compilation)
Quelqu'un aurait t'il une solution?
Ou au moins une explication?
Partager