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.

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";
}
Globalement, si j'active BUG, debBoost = endBoost = 0, sinon, endBoost =1. Est-ce un comportement normal ?

Ensuite, j'ai voulu tester une solution maison (juste pour ce cas). La voici :

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";
}
Et je n'ai pas eu de soucis...

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.

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";
}
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 ?



[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