C++ 对于vector和vector_c,boost::mpl::equal始终为false

C++ 对于vector和vector_c,boost::mpl::equal始终为false,c++,boost-mpl,C++,Boost Mpl,我试图重现Abrahams和Gurtovoy的《C++模板元编程》一书中的“3.1维分析”示例。有时,他们比较一个值(类型为mpl::vector_c)的“维度”与转换值的“维度”相同(mpl::transform应用于两个mpl::vector_c) 对我来说,比较总是错误的,我不知道哪里出了错。简化的示例(无转换): #include <iostream> #include <boost/mpl/vector_c.hpp> #include <boost/mpl

我试图重现Abrahams和Gurtovoy的《C++模板元编程》一书中的“3.1维分析”示例。有时,他们比较一个值(类型为
mpl::vector_c
)的“维度”与转换值的“维度”相同(
mpl::transform
应用于两个
mpl::vector_c

对我来说,比较总是错误的,我不知道哪里出了错。简化的示例(无转换):

#include <iostream>
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/type_index.hpp>
using boost::typeindex::type_id_with_cvr;
using namespace boost;

using X1 = mpl::vector_c<int, 1, 2, 3>;
using X2 = mpl::vector<mpl::int_<1>, mpl::int_<2>, mpl::int_<3>>;
using CMP = mpl::equal<X1, X2>;

int main() {
  std::cout << "X1: " << type_id_with_cvr<X1>().pretty_name() << std::endl;
  std::cout << "X2: " << type_id_with_cvr<X2>().pretty_name() << std::endl;
  std::cout << "CMP: " << type_id_with_cvr<CMP>().pretty_name() << std::endl;
  std::cout << "CMP::type: " << type_id_with_cvr<CMP::type>().pretty_name() << std::endl;
  std::cout << "CMP::type::value: " << CMP::type::value << std::endl;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用boost::typeindex::type\u id\u和\u cvr;
使用名称空间boost;
使用X1=mpl::vector_c;
使用X2=mpl::vector;
使用CMP=mpl::equal;
int main(){

std::cout好的。原因很简单。代码中有一个小错误。但是首先让我们看看
mpl::equal
语义是如何定义的:

typedef equal<Sequence1,Sequence2,Pred>::type c;
更新:正如您在下面的注释中所看到的,用户希望比较包含的值,而不仅仅是类型。以下谓词应该做用户喜欢做的事情(注意:为了简单起见,没有检查(例如,is_integral等)。当然应该这样做。)

模板
struct func:boost::mpl::bool{};
要将其传递给相等者,请写入以下内容:

using CMP = mpl::equal<X1, X2, func<boost::mpl::_1, boost::mpl::_2> >;
使用CMP=mpl::equal;

我不同意你的观点。类型
mpl::integral\u c
mpl::int\u
是相等的。然后我注意到@jv_u的评论,意识到谓词是
相同的
而不是相等的。这是实际的疏忽。更新后的答案是:示例谓词
func
被称为
equal\u tode>在boost-mpl中。我的最终解决方案是:
使用CMP=mpl::equal;
@jv\uu。您已经找到了错误,谢谢。请将注释转换为答案。我想我现在可以导出一个解决方案,但如果您知道在
equal
中使用等式谓词的正确方法,我将不胜感激。
mpl_::integral_c<int, 1>
mpl_::int_<1>
X1: boost::mpl::vector3_c<int, 1, 2, 3>
X2: boost::mpl::vector3<mpl_::integral_c<int, 1>, mpl_::integral_c<int, 2>, mpl_::integral_c<int, 3> >
CMP: boost::mpl::equal<boost::mpl::vector3_c<int, 1, 2, 3>, boost::mpl::vector3<mpl_::integral_c<int, 1>, mpl_::integral_c<int, 2>, mpl_::integral_c<int, 3> >, boost::is_same<mpl_::arg<-1>, mpl_::arg<-1> > >
CMP::type: mpl_::bool_<true>
CMP::type::value: 1
template <typename T, typename V>
struct func : boost::mpl::bool_<(T::value == V::value)> {};
using CMP = mpl::equal<X1, X2, func<boost::mpl::_1, boost::mpl::_2> >;