Могу ли я узнать тип того, что соответствует boost :: proto :: _ в преобразовании? - PullRequest
3 голосов
/ 11 февраля 2012

В руководстве boost :: proto приведен пример грамматики, которая соответствует терминалам типа std :: transform <...>:

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

Я хотел бы написать преобразование, которое делает что-то с типом proto :: _. Например, при сопоставлении с proto :: Terminal > возвращается boost :: shared_ptr .

Возможно ли это?

Другой способ сформулировать мой вопрос: как заставить работать следующий фрагмент кода?

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) >  
{};  

1 Ответ

3 голосов
/ 17 февраля 2012

Ваше преобразование Show будет проще обрабатывать как объект полиморфной функции:

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) >  
{};  
...