`mpl::plus‹ mpl::int_‹1›, mpl::int_‹2› ›::type` отличается от типа `mpl::int_‹3›`?

В приведенном ниже коде воспроизводится поведение библиотеки boost MPL, которое я действительно не понимаю:

#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/plus.hpp>

using namespace boost;

int main() {
  typedef mpl::int_<1> one;
  typedef mpl::int_<2> two;
  typedef mpl::int_<3> three;
  // The following line breaks compilation...
  // static_assert( is_same< mpl::plus<one,two>::type, three >::type::value, "Not the same type");
  // ...while this works
  static_assert( mpl::plus<one,two>::type::value == three::value , "Not the same value");
  return 0;
}

У меня есть вопрос: почему mpl::plus<one,two>::type не того же типа, что и three?

Я столкнулся с этой проблемой, пытаясь решить упражнения в конце главы 3 метапрограммирования шаблонов C++. Я уже пытался заглянуть в <boost/mpl/plus.hpp> и входящие в него включения, но код был слишком сложен, чтобы я мог его понять.


person Massimiliano    schedule 19.07.2012    source источник


Ответы (1)


Гарантируется, что возвращаемый тип plus будет целочисленной константой. У вас нет гарантии относительно его точного типа, поэтому ваше утверждение разрешено с ошибкой.

Точные типы:

mpl::plus<one,two>::type == mpl_::integral_c<int, 3>
three == foo<mpl_::int_<3> >

Это неинтуитивно. Одна проблема заключается в том, что plus<int_, int_> теоретически может вернуть integral_c, где первый аргумент имеет большую емкость, чем int_ в случае переполнения.

Для отладки может быть полезно type printer:

template<typename> print; // undefined instantiation leads to error with name
print<three> x; // nice error message
person pmr    schedule 19.07.2012
comment
Спасибо за совет template<typename> struct print;! - person Massimiliano; 19.07.2012
comment
@Massimiliano Есть также mpl::print, но он кажется сломанным как минимум на gcc. Что-то, что не прерывает компиляцию, было бы намного лучше. - person pmr; 19.07.2012
comment
в качестве примечания, этот си зарегистрирован как проблема в boost Trac. Итак, мы знаем, что это проблема :) - person Joel Falcou; 19.07.2012