Bonjour,

tout d'abord j'ai une fonction ConvertTo qui permet de convertir un type en un autre:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
template <class A, class B>
A ConvertTo(const B &item)
{
    stringstream str;
    str << item;
    A ret;
    str >> ret;
    return ret;
}
A l'appel, on fait donc:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
....
int a = 10;
string b = ConvertTo<string>(a);
cout << b << endl;
Jusque là, pas de problèmes.

J'ai même réussi à spécialiser la fonction pour passer d'une string à un int:

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
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
template <class A, class B>
A ConvertTo(const B &item)
{
    stringstream str;
    str << item;
    A ret;
    str >> ret;
    return ret;
}
 
/** marche très bien **/
template <>
inline int ConvertTo(const std::string &item)
{
    return atoi(item.c_str());
}
Et là, à l'appel:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
int main()
{
     string a = "130";
     int i = ConvertTo<int>(a);
     cout << i << endl;
 
     return 0;
}
C'est bien la fonction spécialisée qui est appelée.

Seulement je n'arrive pas à faire la même chose avec A = int et B = const char*.

Voici le code complet:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
template <class A, class B>
A ConvertTo(const B &item)
{
    cout << "Fonction générique appelée" << endl;
    stringstream str;
    str << item;
    A ret;
    str >> ret;
    return ret;
}
 
/** marche très bien **/
template <>
inline int ConvertTo(const std::string &item)
{
    cout << "Fonction spécialisée appelée" << endl;
    return atoi(item.c_str());
}
 
/** ne compile pas **/
//template <>
//inline int ConvertTo(const char* item)
//{
//    return atoi(item);
//}
 
/** compile mais n'est pas appelé **/
template <int>
inline int ConvertTo(const char* item)
{
    cout << "Fonction spécialisée appelée" << endl;
    return atoi(item);
}
 
/** compile mais n'est pas appelé **/
template <int, const char *>
inline int ConvertTo(const char* item)
{
    cout << "Fonction spécialisée appelée" << endl;
    return atoi(item);
}
 
/** Compile, mais pour être appelé il faut enlever le <int> lors de l'appel **/
inline int ConvertTo(const char*item)
{
    cout << "Fonction spécialisée appelée" << endl;
    return atoi(item);
}
 
int main()
{
    string a = "130";
    int i = ConvertTo<int>(a);
    cout << i << endl;
 
    const char * b = "10";
    int j = ConvertTo<int>(b);
    cout << j << endl;
    return 0;
}
J'ai MinGW...
Es-ce un comportement normal avec les pointeurs, ou avec d'autre compilateurs (comme le GCC le plus récent) ça marche?

Merci