読者です 読者をやめる 読者になる 読者になる

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
));