2012-02-10 6 views
3

::プロトマニュアル、タイプSTDの端子に一致する文法の例があります:: <を変換...>:変換でboost :: proto :: _と一致するものの種類を知ることはできますか?ブーストで

struct StdComplex 
    : proto::terminal< std::complex<proto::_> > 
{}; 

私はと何かをするという変革を書きたいですproto :: _の型。 たとえば、proto :: terminal < std :: complex < T>>と一致すると、boost :: shared_ptr < T>が返されます。

これは可能ですか?

私の質問を述べる別の方法は、次のスニペットの仕組みをどうやって作るのですか?あなたのショー変換

template<typename T> 
struct Show : proto::callable 
{ 
    typedef T result_type; 

    result_type operator()(T& v) 
    { 
     std::cout << "value = " << v << std::endl; 
     return v; 
    } 
}; 


struct my_grammar 
: proto::when<proto::terminal<proto::_ >, Show<??? what comes here ???>(proto::_value) > 
{}; 

答えて

3

は、多様関数オブジェクトとして扱うことが容易になります。

struct Show : proto::callable 
{ 
    template<class Sig> struct result; 

    template<class This, class T> 
    struct result<This(T)> 
    { 
    typedef T type; 
    }; 

    template<class T> T operator()(T const& v) const 
    { 
     std::cout << "value = " << v << std::endl; 
     return v; 
    } 
}; 

struct my_grammar 
: proto::when<proto::terminal<proto::_ >, Show(proto::_value) > 
{}; 

他の問題にあなたの答えは次のとおりです。

struct to_shared : proto::callable 
{ 
    template<class Sig> struct result; 

    template<class This, class T> 
    struct result<This(T)> 
    { 
    typedef typename T::value_type base; 
    typedef shared_ptr<base> type; 
    }; 

    template<class T> 
    typename result<to_share(T)>::type operator()(T const& v) const 
    { 
    // stuff 
    } 
}; 


struct my_grammar 
: proto::when<proto::terminal<complex<proto::_> >, to_shared(proto::_value) > 
{}; 
+0

ありがとう - 非常にエレガント! –

+0

これは、 のために働くようですproto :: terminal :: type term1 = {{21}}; ではなく proto :: terminal :: type term1 = {{21}}; 私は正しいですか?私のアプリケーションでは、端末がshared_ptrを保持して、変換が変更できるものを指し示すようにしたい。これは問題ですか?ありがとう。 –

+0

非const intのコンパイラからのエラーは次のとおりです。 'int'型への非const左辺参照は、 'int'型の一時的なものにバインドできません。 –

関連する問題