gpt4 book ai didi

c++ - 检查两个 Boost.MPL 序列是否以任何顺序包含相同的类型

转载 作者:太空狗 更新时间:2023-10-29 22:54:09 25 4
gpt4 key购买 nike

是否有一种直接的方法来检查两个 MPL 序列(例如 boost::mpl::set)是否包含相同的元素而不考虑它们的顺序?

例如,考虑以下内容:

#include <boost/mpl/set.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/assert.hpp>

int main()
{
typedef boost::mpl::set<int, double, bool> X;
typedef boost::mpl::set<double, bool, int> Y;

// We'd want this to pass, but obviously it won't ...
BOOST_MPL_ASSERT((boost::mpl::equals<X, Y>));
}

原则上,可以做的是编写一些样板来检查 (i) X 和 Y 是否具有相同的大小(使用 boost::mpl::size)和 (ii) 验证X 的每个元素都包含在 Y 中(使用 boost::mpl::contains)。另一种方法是以某种方式将两个序列排序为某种“规范顺序”,然后检查它们是否相等,但我不知道是否有这方面的功能。

但我想知道:在 Boost.MPL(或 Boost 中的任何地方)中是否已经有一个函数可以完成我们想要的功能?

最佳答案

#include <boost/mpl/and.hpp>
#include <boost/mpl/not.hpp>
#include <boost/mpl/set.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/contains.hpp>
#include <boost/mpl/assert.hpp>

namespace mpl=boost::mpl;

//template <typename Seq1, typename Seq2>
//using unordered_equal = mpl::equal<Seq1,Seq2,mpl::and_<mpl::contains<Seq2,mpl::_1>, mpl::contains<Seq1,mpl::_2> > >;

template <typename Seq1, typename Seq2>
struct unordered_equal : mpl::equal<Seq1,Seq2,mpl::and_<mpl::contains<Seq2,mpl::_1>, mpl::contains<Seq1,mpl::_2> > >
{};

int main()
{
typedef mpl::set<int, double, bool> X;
typedef mpl::set<double, bool, int> Y;
typedef mpl::set<double, bool> Z;

// We'd want this to pass, but obviously it won't ...
BOOST_MPL_ASSERT((unordered_equal<X, Y>));
BOOST_MPL_ASSERT((mpl::not_<unordered_equal<X,Z> >));
}

关于c++ - 检查两个 Boost.MPL 序列是否以任何顺序包含相同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57209266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com