В 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 является примером).


person quant    schedule 30.09.2014    source источник


Ответы (1)


  1. equal_to моделирует числовую метафункцию< /em> концепция. Вы хотели бы использовать equal.
  2. вы захотите применить метафункцию перед сравнением, я добавил ::type в утверждение
  3. ожидаемый тип на самом деле не соответствует, поэтому он не будет работать, если вы не сопоставите их.

Смотрите Прямой эфир на Coliru

#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> ));
person sehe    schedule 30.09.2014