Je peux analyser des nombres à partir de caractères stockés dans std :: string, std :: vector ou std :: array. Mais je ne suis pas capable de le faire quand les caractères sont dans un tampon contenu dans std :: unique_ptr. je pouvais copier le tampon dans une chaîne puis pour stimuler l'esprit, mais je veux éviter cette copieComment analyser un double d'un tableau de caractères en utilisant boost :: spirit :: qi :: parse
Voici ma tentative:
#include<memory>
#include<array>
#include<iostream>
#include "boost/spirit/include/qi.hpp"
int main()
{
const int max_size = 40;
std::array<wchar_t, max_size> numeric1;
std::wstring src = L"5178120.3663";
std::wcsncpy(numeric1.data(), src.data(), max_size);
double num = 0.0;
boost::spirit::qi::parse(numeric1.begin(), numeric1.end(), num);
std::cout.precision(15);
std::cout << num << std::endl; // OK
std::unique_ptr<wchar_t[]> numeric2(new wchar_t[max_size]);
std::wcsncpy(numeric2.get(), src.data(), max_size);
std::wcout << L"ok = " << std::wstring(numeric2.get()) << std::endl; // OK
boost::spirit::qi::parse(numeric2.data(), max_size, num); // fails to compile
std::cout.precision(15);
std::cout << num << std::endl;
// 'boost::spirit::qi::parse': no matching overloaded function found
return 0;
}
Le correctif:
boost::spirit::qi::parse(numeric2.get(), numeric2.get() + wcslen(numeric2.get()), num);
Voir Zalman de anwer
C'est le bonne réponse. S'il vous plaît modifier comme suit et je vais accepter; boost :: esprit :: qi :: parse (numeric2.get(), numeric2.get() + wcslen (numeric2.get()), num) car il ne compile pas tel quel –
Fixé pour utiliser wcsnlen, qui devrait correspondre le type de char large et garantit toujours de ne pas couler la fin de la mémoire tampon. Dans l'exemple de code, il est peut-être préférable de tout simplement coder en dur la longueur de la chaîne d'entrée. –