我可以從存儲在的std :: string,性病::向量或std ::字符數組解析數字。 但是,當字符在std :: unique_ptr中的緩衝區中時,我無法這樣做。 我可以在緩衝區拷貝到一個字符串,則提振精神,但我想避免這種拷貝如何從使用boost ::精神::氣字符數組解析雙::解析
這裏是我的嘗試:
#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;
}
的修復:
boost::spirit::qi::parse(numeric2.get(), numeric2.get() + wcslen(numeric2.get()), num);
見Zalman的前面回答
這是 正確答案。請修改如下,我會接受;升壓::精神::齊::解析(numeric2.get(),numeric2.get()+ wcslen(numeric2.get()),NUM),因爲它不會編譯如 –
固定使用wcsnlen,這應該匹配寬字符類型,並仍然保證不會跑出緩衝區的末尾。在示例代碼中,無論如何,最好只是硬編碼輸入字符串的長度。 –