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.