在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。
答案 0 :(得分:3)
g ++ 4.8.0给出的错误基本上是:
decltype的计算结果为
phx::actor<proto::expression>&
,它不是类或枚举类型
要使用::
,您需要拥有不合格的类型,因此您必须删除引用:
#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;
};