4

下面的代码重现了我真的不了解 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

我在尝试解决 C++ Template Meta-Programming第 3 章末尾的练习时遇到了这个问题。我已经尝试查看<boost/mpl/plus.hpp>其中包含的内容,但是代码太复杂了,我无法理解。

4

1 回答 1

5

的返回类型plus只保证是一个整数常量。您无法保证它的确切类型,因此您的断言允许失败。

确切的类型是这样的:

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

这是不直观的。一个问题是plus<int_, int_>理论上可以返回 aintegral_c其中第一个参数具有更大的容量然后int_在溢出的情况下。

对于调试 atype printer可能很有用:

template<typename> print; // undefined instantiation leads to error with name
print<three> x; // nice error message
于 2012-07-19T13:22:03.397 回答