Получение типа тега дочернего выражения Boost Proto

Выражение 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.

1

Решение

Ошибка, которую дает 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;
};
3

Другие решения

Других решений пока нет …