通常当我编写代码时,我会经常检查我正在做什么但是使用某种断言操作:
std::vector<int> a(1, 1);
std::vector<int> b = {1};
assert(a == b); // this either works, or breaks in a helpful manner
如何在boost mpl
中实现这一目标?我目前正在尝试从2个向量生成对向量,其中第一个向量表示键,第二个向量表示值(即 types ):
using Keys = boost::mpl::vector<double, bool, int, char, bool*>;
using Types = boost::mpl::vector<char, char, int, int, int>;
using ExpectedOutput =
boost::mpl::vector<
boost::mpl::pair<double, char>,
boost::mpl::pair<bool, char>,
boost::mpl::pair<int, char>,
boost::mpl::pair<char, int>,
boost::mpl::pair<bool*, int>>;
// now I perform some operation which I _think_ might work
using PairsSequence =
typename boost::mpl::transform<
Keys,
Types,
boost::mpl::pair<boost::mpl::_1, boost::mpl::_2>>;
// Now I attempt to check that it worked
BOOST_MPL_ASSERT(( boost::mpl::equal_to<PairsSequence, ExpectedPairsSequence> ));
但这并不起作用,大概是因为boost::mpl::transform
的返回类型是一些模板表达式。如何强制将此输出转换为可以与预期值进行比较的类型?
其他人如何调试他们的MPL代码? Boost似乎没有提供任何检查操作输出的工具(或者至少我不知道如何使用它们,BOOST_MPL_ASSERT
就是一个例子。)
答案 0 :(得分:1)
equal_to
models the Numeric Metafunction concept。您可能希望使用equal
。 ::type
#include <boost/mpl/vector.hpp>
#include <boost/mpl/pair.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/equal.hpp>
using Keys = boost::mpl::vector<double, bool, int, char, bool*>;
using Types = boost::mpl::vector<char, char, int, int, int>;
using ExpectedOutput =
boost::mpl::vector<
boost::mpl::pair<double, char>,
boost::mpl::pair<bool, char>,
boost::mpl::pair<int, int>,
boost::mpl::pair<char, int>,
boost::mpl::pair<bool*, int>>;
// now I perform some operation which I _think_ might work
using PairsSequence =
typename boost::mpl::transform<
Keys,
Types,
boost::mpl::pair<boost::mpl::_1, boost::mpl::_2>>;
BOOST_MPL_ASSERT(( boost::mpl::equal<PairsSequence::type, ExpectedOutput> ));