【问题标题】:Obtaining the tag type of a Boost Proto child expression获取Boost Proto子表达式的标签类型
【发布时间】:2013-05-17 23:02:39
【问题描述】:

对于 Boost Proto 表达式,我什么时候不应该期待 proto_tag 成员?我可以使用以下任一方法查询占位符的标签类型:

typedef proto::tag_of<decltype(_1)>::type ta;
typedef decltype(_1)::proto_tag           tb;

但是如果我询问表达式的child 的标签类型,似乎proto_tag 成员不存在;并且以下代码的第三行给出了错误:

auto f = _1 + _2;
typedef proto::tag_of<decltype(proto::child_c<0>(f))>::type tc;
typedef decltype(proto::child_c<0>(f))::proto_tag           td; // error

Clang 和 GCC 的错误报告有问题的类型:不是类、命名空间或范围枚举。我使用 Clang 3.2、GCC 4.7.2 和 Boost 1.53。

【问题讨论】:

    标签: c++ boost typetraits boost-proto


    【解决方案1】:

    g++ 4.8.0给出的错误基本是:

    decltype 计算结果为 phx::actor&lt;proto::expression&gt;&amp;,它不是类或枚举类型

    为了使用::,你需要有一个非限定类型,所以你必须删除引用:

    #include <type_traits>
    typedef std::remove_reference<decltype(proto::child_c<0>(f))>::type::proto_tag td;
    

    我相信你也可以使用:

    typedef proto::result_of::child_c<decltype(f),0>::type::proto_tag td;
    

    使用proto::tag_of,您无需担心可能的引用,因为它会在必要时被删除:

    template<typename Expr>
    struct tag_of
    {
        typedef typename Expr::proto_tag type;
    };
    
    template<typename Expr>
    struct tag_of<Expr &>
    {
        typedef typename Expr::proto_tag type;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-26
      • 2012-08-28
      • 2016-11-22
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多