mpl::equalに渡すところをstd::is_sameにしてしまった
ちょっとハマったのでメモ。
ある日、以下の様なコードを書いてました。
typedef mpl::vector_c<int, 1, 2, 3> foo; typedef mpl::transform<foo, mpl::plus<_1, mpl::int_<1>>>::type bar; typedef mpl::vector_c<int, 2, 3, 4> expected; int main() { BOOST_STATIC_ASSERT(( std::is_same<bar, expected>::value )); }
てっきり mpl::transform で mpl::vector_c が返ってくると期待していた私は、BOOST_STATIC_ASSERTで失敗しているのに気がついてかなりびっくりしました。
ここでの mpl::transform によって返ってくる型は
struct mpl::vector3< struct mpl::integral_c<int, 2>, struct mpl::integral_c<int, 3>, struct mpl::integral_c<int, 4> >
ぜんぜん違うじゃねーか
なので、多分 std::is_same と相性そんなに良くないのかもしれません。
素直に mpl::equal 使いましょう。
BOOST_STATIC_ASSERT(( mpl::equal<bar, expected>::value ));