2

の以前の質問では、ディレクティブを使用してboost::spirit::x3解析することでパーサーのパフォーマンスを改善できることが示唆されました。boost::string_viewraw

ただし、コンパイルするのに苦労しています。これは私が見つけたものです:

  • 以前は、ディレクティブを処理するx3ために特殊化する必要がありましたassign_to_attribute_from_iterators(たとえば、この SO の回答を参照)。raw

  • x3move_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_viewfromをインスタンス化するにはどうすればよいstd::string::const_iteratorですか?

2)オーバーロードboost/spirit/home/x3.hppの前に含まれている場合move_to

実際の例

オーバーロードが選択されないのはなぜですか? で定義されているものよりも優れたオーバーロードではありませんboost/spirit/home/x3/support/traits/move_to.hppか? 含める順序に関係なく、オーバーロードが選択されていることを確認するにはどうすればよいですか?

4

1 に答える 1