В boost MPL, как я могу проверить, работает ли операция, как задумано?
Обычно, когда я пишу код, я часто проверяю, что то, что я делаю, работает, но используя какую-то операцию подтверждения:
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 векторов, где первый вектор представляет ключи, а второй - значения (т.е. типы):
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
быть показательным примером).
1 ответ
equal_to
моделирует концепцию числовой метафункции. Вы хотели бы использовать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> ));