В веб-документации Boost MPL , в нем говорится о передаче классов метафункций в качестве аргументов для boost::mpl::transform. Аргумент метафункции в этом случае должен быть какой-то операцией, выполняемой над mpl::ForwardSequence. Однако при применении mpl::transform к mpl::map с использованием простого класса метафункций я получаю ошибки шаблона. (Поскольку эти ошибки довольно обширны, я включил только то, что, по моему мнению, является уместным. Я более чем счастлив опубликовать более подробный отчет об ошибках, если потребуется.)
Ошибка:
/usr/include/boost/mpl/aux_/preprocessed/gcc/bind.hpp:207:21: error: no type named ‘type’ in ‘struct boost::mpl::apply_wrap2<boost::mpl::push_front<mpl_::na, mpl_::na>, boost::mpl::map0<>, boost::mpl::pair<unsigned int, INT32U> >’
test_boost_mpl.cpp:106:1: error: ‘from_native_tmap’ was not declared in this scope
В моем конкретном случае мой код выглядит следующим образом:
/* stl includes */
#include <cstdint>
/* boost includes */
#include <boost/type_traits.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/map.hpp>
#include <boost/mpl/empty.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/transform.hpp>
struct Boolean {
enum { tag_value = 0x83 };
};
struct INT32U {
enum { tag_value = 0x84 };
};
typedef mpl::map
<
mpl::pair<Boolean, bool>,
mpl::pair<INT32U, std::uint32_t>
> to_native_tmap;
struct swap_f {
template<typename PAIR>
struct apply {
typedef typename mpl::pair<typename PAIR::second, typename PAIR::first> type;
};
};
typedef mpl::transform<to_native_tmap, swap_f>::type from_native_tmap;
BOOST_MPL_ASSERT(( is_same
<mpl::at<from_native_tmap, bool>::type, Boolean> ));
BOOST_MPL_ASSERT(( is_same
<mpl::at<from_native_tmap, std::uint32_t>::type, INT32U> ));
int main(void) { return 0; }
Мое намерение состоит в том, чтобы иметь сопоставление с собственными типами С++ в to_native_tmap
, а затем обратное сопоставление в from_native_tmap
.
Этот код завершается ошибкой либо при BOOST_MPL_ASSERT()
, либо при попытке создать экземпляр типа to_native_tmap
mpl::map.
Большое спасибо!' перед тем, кто готов помочь.