Bonsoir,
le code suivant est un emprunt au tuto de David Come sur les pattern objet en C++.
Je voudrais créer une classe template Singleton,
et je cherche à lui fournir un opérateur de comparaison qui prendrait des entiers.
Je ne parviens pas à écrire son code template.
le code de singleton_tpl.tpp avec le nécessaire opérateur == :
Code c++ : 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
40
41
42
43
44
45
46
47
48
49 #include <stdio.h> #include <iostream> using namespace std ; template <class T> T Singleton<T>::m_i = T(); template <class T> T& Singleton<T>::instance() { if(m_i == 0) // premier check { // CODE to lock myself lock() ; if(m_i == 0) // second { m_i = // phase 3 de la liste static_cast<T*>(operator new(sizeof(T))) ; // phase 1 new (m_i) T; // phase 2 UUID = rand () ; pthread_mutex_init (&mutex, NULL) ; } if (m_i != 0) // l'objet est bien initialisé { unlock() ; // ici on déverrouille simplement } // un des threads, } return m_i; // ainsi il suffit d'appeler instance () plusieurs fois } // pour être sûr de déverrouiller notre thread template <class T> void Singleton<T>::lock() { pthread_mutex_lock (&mutex) ; } template <class T> void Singleton<T>::unlock() { pthread_mutex_unlock (&mutex) ; } template <class T> bool Singleton<T>::operator==(int i) const { if ( UUID == (reinterpret_cast<T>(i)).UUID ) { return true ; } return false ; }
Le compilateur (g++) me dit que mon reinterpret_cast est illégal.
Est-ce que je fais fausse route ?
Merci.
Partager