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

最佳答案

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

关于c++ - 我能知道转换中匹配的boost::proto::_的类型吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9234358/

10-13 06:11