2

Boost MPL web-documentationでは、メタ関数クラスを引数として boost::mpl::transform に渡すことについて説明しています。この場合、メタ関数の引数は、mpl::ForwardSequence で実行する何らかの操作である必要があります。ただし、単純なメタ関数クラスを使用して mpl::map に mpl::transform を適用すると、テンプレート エラーが発生します。(これらのエラーは非常に広範囲にわたるため、関連するビットと思われるもののみを含めました。要求があれば、より詳細なエラー レポートを喜んで投稿します。)

エラー:

/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; }

私の意図は、 でネイティブの c++ 型にto_native_tmapマッピングし、次に で逆マッピングすることfrom_native_tmapです。

このコードは、またはmpl::map 型BOOST_MPL_ASSERT()をインスタンス化しようとした場合に失敗します。to_native_tmap

大きな「ありがとう!」喜んで助けてくれる人に前もって。

4

1 に答える 1