Bonjour à tous, j'ai créé une petite fonction nommée extractStrInfo qui permet de récupérer une donnée venant d'une chaîne de caractère en renvoyant cette donnée avec le bon type associé. Le problème est que je ne sais pas récupérer ma donnée :/ d’ailleurs je ne sais pas non plus si je m'y prends de la bonne façon, je n'utilise presque jamais les templates.
Voici tout le code que j'ai fait :
function.hpp
function.cpp
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 #ifndef Function_included #define Function_included #include <string> #include <sstream> #include <vector> #include <ctype.h> #include <algorithm> #include "Item.hpp" namespace xy { void split( std::string const &s, char delim, std::vector<std::string> &elems ); template <class T> T extractStrInfo( std::string const &str, char delim, unsigned int pos ); bool isNumber( std::string const &str ); bool isBool( std::string const &str ); std::string toLower( std::string const &str ); std::string toUpper( std::string const &str ); bool toBool( std::string const &str ); }; #endif // Function_included
En faite j'ai une BDD contenant des items, elle ressemble à ceci :
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
67
68
69
70
71
72
73
74
75 #include "function.hpp" void xy::split( std::string const &s, char delim, std::vector<std::string> &elems ) { std::stringstream ss; ss.str(s); std::string str; while(std::getline(ss, str, delim)) { elems.push_back(str); } } template <class T> T xy::extractStrInfo( std::string const &str, char delim, unsigned int pos ) { std::vector<std::string> elems; xy::split( str, delim, elems ); if( pos > elems.size() - 1 ) { throw std::string("[Extractor] Element out of reach " + static_cast<std::string>(pos) + '/' + static_cast<std::string>(elems.size() - 1) + '.'); } else { if( xy::isNumber(elems[pos]) ) return std::stoi(elems[pos]); else if( xy::isBool(elems[pos])); return xy::toBool(elems[pos]); return elems[pos]; } } bool xy::isNumber( std::string const &str ) { for( size_t i{0}; i < str.size(); ++i ) { if(!isdigit(str[i]) && str[i] != '-') return false; } return true; } bool xy::isBool( std::string const &str ) { if( xy::toLower(str) == "true" || xy::toLower(str) == "false" ) return true; return false; } std::string xy::toLower( std::string const &str ) { std::string n{str}; std::transform(n.begin(), n.end(), n.begin(), tolower); return n; } std::string xy::toUpper( std::string const &str ) { std::string n{str}; std::transform(n.begin(), n.end(), n.begin(), toupper); return n; } bool xy::toBool( std::string const &str ) { if( !xy::isBool(str) ) throw std::string("[ToBool] " + str + " is not convertible."); else { if( xy::toLower(str) == "true" ) return true; return false; } }
J'ai une classe Item et je souhaite charger depuis cette BDD toutes ses caractéristiques.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 645;50;Amulet;Amulette Royale du Bouftou;true;0;0;0;0;30;30;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 646;50;Amulet;Amuronce;true;40;0;0;-15;20;0;20;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 647;50;Amulet;Amublop Reinette;true;40;0;0;15;25;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;5;0;0 ....
Bref. En l’occurrence la fonction extract me servira juste pour récupérer des infos pour debug, je ferais une autre fonction presque similaire pour charger directement un Item mais encore faudrait-il que je comprenne comment faire la conversion x).
Voilà voilà donc si vous pouvez m'expliquer comment faire ce serait sympa ^^". En soit le code fonctionne mais, il ne fait peut-être pas ce que je souhaite réellement ou bien je ne sais juste pas me servir de ce que j'ai créé ( il faut le faire quand même ).
Je vous remercie de bien vouloir m'aider.
Disixlis
Ps : Je ne souhaitais pas utiliser d'api comme mysql connector, car je veux apprendre par moi même et cela fait un bon exercice. || Je ne veux pas d'un bloc de code en guise de solution, par contre un bloc d'explications serait sympa
Partager