私の以前の質問では、ディレクティブを使用してboost::spirit::x3
解析することでパーサーのパフォーマンスを改善できることが示唆されました。boost::string_view
raw
ただし、コンパイルするのに苦労しています。これは私が見つけたものです:
以前は、ディレクティブを処理する
x3
ために特殊化する必要がありましたassign_to_attribute_from_iterators
(たとえば、この SO の回答を参照)。raw
x3
move_to
代わりに free 関数を使用するようになりました (たとえば、この SO answerを参照してください)。
したがって、move_to
から解析すると機能するオーバーロードを追加しましたchar*
:
#include <iostream>
#include <string>
#include <boost/utility/string_view.hpp>
namespace boost {
namespace spirit { namespace x3 { namespace traits {
template <typename It>
void move_to(It b, It e, boost::string_view& v)
{
v = boost::string_view(b, std::size_t(std::distance(b,e)));
}
} } }
} // namespace boost
#include <boost/spirit/home/x3.hpp>
namespace parser
{
namespace x3 = boost::spirit::x3;
using x3::char_;
using x3::raw;
const auto str = raw[ +~char_('_')] >> '_';
}
int main()
{
std::string input = "hello world_";
boost::string_view str;
parse(input.data(), input.data()+input.size(), parser::str, str);
std::cout << str;
}
ただし、コンパイルされません。
1)を使用して解析する場合std::string::const_iterator
parse(input.cbegin(), input.cend(), parser::str, str);
いずれかのコンストラクターは、または をboost::string_view
想定しています。const char*
std::string&
main.cpp:12:16: error: no matching function for call to 'boost::basic_string_view<char, std::char_traits<char> >::basic_string_view(__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&, std::size_t)'
v = boost::string_view(b, std::size_t(std::distance(b,e)));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
boost::string_view
fromをインスタンス化するにはどうすればよいstd::string::const_iterator
ですか?
2)オーバーロードboost/spirit/home/x3.hpp
の前に含まれている場合move_to
オーバーロードが選択されないのはなぜですか? で定義されているものよりも優れたオーバーロードではありませんboost/spirit/home/x3/support/traits/move_to.hpp
か? 含める順序に関係なく、オーバーロードが選択されていることを確認するにはどうすればよいですか?