获取Boost Proto子表达式的标签类型
Obtaining the tag type of a Boost Proto child expression
对于Boost Proto表达式,什么时候不应该期望proto_tag
成员?我可以查询占位符的标记类型,例如,使用以下方法之一:
typedef proto::tag_of<decltype(_1)>::type ta;
typedef decltype(_1)::proto_tag tb;
但是,如果我询问表达式的子的标记类型,则似乎没有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。
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;
};
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 使用 AWS c++ 接口将文件上传到 s3 时内容类型标签不正确
- dlib-如何使用lose_mean_squared_multioutput培训标签类型
- 我可以给出不同的行为来提升::p roto::标签类型吗?
- 使用类型标签时C++函数不明确
- 如何使用ODEINT的标签系统为各种步进器类型做特定工作
- 返回提升类型::累加器::标签::平均值
- 编译错误在 boost::mpl:::<T>标签::类型
- 如果枚举标签与类型不匹配,编译器是否应该发出警告?
- 获取Boost Proto子表达式的标签类型
- 如果要读取随机森林(opencv3.0)的xml文件,则标签类型必须为float