1

boost::xpressive は遅延評価されたバージョンの演算子を提供していないようです。そのnewため、このセマンティック アクションはコンパイルされません。

using namespace boost::xpressive ;
std::vector<int*> vec ;

// Match any integer and capture into s1.
// Then use a semantic action to push it onto vec.
sregex num = (s1= +digit)[ ref(vec)->*push_back( new as<int>(s1) ) ] ;

セマンティック アクションで new 演算子を使用するための構造はありますか? たとえば、boost::phoenix はラムダのnew_関数を提供します。xpressive はセマンティック アクションに似たものを提供しますか?

4

1 に答える 1

1

これは私がこれまで思いついた中で最高です。new_<T>::with(...)このコードは、構文を と同等のセマンティック アクションとして使用できるようにする関数を定義しますnew T(...)。この関数は、boost xpressive ユーザー ガイドの遅延関数の例をモデルにしています。(以下のスニペットは、最大 2 つのパラメーターを持つコンストラクターのみをサポートしますが、さらに追加するには、コピー/貼り付けの問題です。)

using namespace boost::xpressive ;

template <typename _ObjectType>
struct new_impl
{
    typedef _ObjectType* result_type;

    _ObjectType* operator()() const
    {
        return new _ObjectType() ;
    }

    template<typename _T0>
    _ObjectType* operator()(_T0 const &a0) const
    {
        return new _ObjectType( a0 ) ;
    }

    template<typename _T0, typename _T1>
    _ObjectType* operator()(_T0 const &a0, _T1 const &a1) const
    {
        return new _ObjectType( a0, a1 ) ;
    }
};

template <typename _ObjectType>
struct new_
{
    static const typename function<new_impl<_ObjectType> >::type with ;
};
template <typename _ObjectType>
const typename function<new_impl<_ObjectType> >::type new_<_ObjectType>::with = {{}};

そして、ここでそれが実行されています:

int main()
{
    std::vector<int*> vec ;

    // Matches an integer, with a semantic action to push it onto vec
    sregex num = (s1= +digit)
                 [ ref(vec)->*push_back( new_<int>::with( as<int>(s1) ) ) ] ;

    // Space-delimited list of nums
    sregex num_list = num >> *(' ' >> num) ;

    std::string str = "8 9 10 11" ;
    if ( regex_match( str, num_list ) )
    {
        std::cout << "Found an int list: " ;
        BOOST_FOREACH( int* p, vec )
        {
            std::cout << *p << ' ' ;
        }
    }
    else
    {
        std::cout << "Didn't find an int list." ;
    }

    return 0 ;
}

出力:

Found an int list: 8 9 10 11

boost::add_reference<>上記のコードの一般性を向上させるには、パラメーターの型をおよびを使用するように変更する方がよい場合がありboost::add_const<>ますが、おわかりいただけたでしょうか。

于 2011-11-30T05:12:03.940 に答える