Выражение 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;
};
Других решений пока нет …