Bonjour à tous,
J'utilise boost 1.57 pour tester l'existence d'un opérateur << avec mingw 4.7 et je remarque un comportement plutôt perturbant avec le code ci-dessous.
Globalement, si j'active BUG, debBoost = endBoost = 0, sinon, endBoost =1. Est-ce un comportement normal ?
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 #include <boost/type_traits/has_operator.hpp> #include <ostream> #include <iostream> #define BUG class Test { }; #ifdef BUG bool debBoost = boost::has_left_shift<std::ostream&, const Test&, std::ostream&>::value; #endif std::ostream& operator<<(std::ostream&, const Test&); bool endBoost = boost::has_left_shift<std::ostream&,const Test&, std::ostream&>::value; int main() { #ifdef BUG std::cout<<"debBoost = "<<debBoost<<"\n"; #endif std::cout<<"endBoost = "<<endBoost<<"\n"; }
Ensuite, j'ai voulu tester une solution maison (juste pour ce cas). La voici :
Et je n'ai pas eu de soucis...
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 #include <ostream> #include <iostream> #include <type_traits> class Test { }; struct delay { template<typename T> delay(const T&); }; std::false_type operator<<(std::ostream&, delay); bool deb = !std::is_same<decltype(std::declval<std::ostream&>() << std::declval<const Test&>()), std::false_type>::value; std::ostream& operator<<(std::ostream&, const Test&); bool end = !std::is_same<decltype(std::declval<std::ostream&>() << std::declval<const Test&>()), std::false_type>::value; int main() { std::cout<<"deb = "<<deb<<"\n"; std::cout<<"end = "<<end<<"\n"; }
Ce problème est-il uniquement chez moi ?
Finalement, après un troisième test, le problème ne vient pas de boost puisque j'obtiens les même résultats que boost.
Je suppose que tout ce ci est normal... Est-il possible de faire pour que la valeur soit évaluée lorsqu'elle est demandée et non à la première demande ?
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
34
35
36
37
38
39 #include <ostream> #include <iostream> #include <type_traits> #define BUG class Test { }; struct delay { template<typename T> delay(const T&); }; std::false_type operator<<(std::ostream&, delay); template<typename T> struct Has { static constexpr bool value = !std::is_same<decltype(std::declval<std::ostream&>() << std::declval<const T&>()), std::false_type>::value; }; #ifdef BUG bool deb = Has<Test>::value; #endif std::ostream& operator<<(std::ostream&, const Test&); bool end = Has<Test>::value; int main() { #ifdef BUG std::cout<<"deb = "<<deb<<"\n"; #endif std::cout<<"end = "<<end<<"\n"; }
[EDIT] Je n'ai testé le deuxième code qu'après avoir commencé à éditer le message, et je ne pensais pas que le problème venait de boost (je pensais que ma solution allait échouer elle aussi). Quelqu'un pourrait-il déplacer la conversation dans le forum dédié à boost ?
[EDIT2] Finalement, ce n'est pas lié à boost
Partager