4 Stimmen

BOOST MPL Das Hinzufügen von zwei list_c-Objekten führt zu unerwartetem Verhalten

Ich habe folgenden Code:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace boost::mpl;

typedef list_c evens;
typedef list_c primes;
typedef list_c sums;

typedef transform< evens, primes, plus<> >::type result;
BOOST_MPL_ASSERT(( equal< result,sums,equal_to<_1,_2> > ));

int main()
{
    std::cout << typeid(sums).name() << std::endl << typeid(result).name() << std::endl;
    assert(typeid(sums) == typeid(result));
}

Es kompiliert, also gilt die BOOST_MPL_ASSERT. Allerdings schlägt die Überprüfung in der main-Funktion fehl. Was bedeutet das? Sollten nicht zwei list_c-Dinge (mir fehlt das richtige Wort) mit den gleichen Elementen denselben Typ definieren?

Vielen Dank für deine Hilfe.

1voto

John Bandela Punkte 2386

MPL gibt keine Garantien über die genauen Typen ab, die aus den MPL-Algorithmen resultieren.

1voto

ecatmur Punkte 145884

transform gibt eine nicht spezifizierte Sequenztyp (von integral_c-Elementen) aus, nicht ein list_c.

Eine Möglichkeit, das Ergebnis von transform in einen bekannten Typ umzuwandeln, besteht darin, insert_range auf einer list zu verwenden:

insert_range, begin >::type, result>::type

Leider ergibt dies keine list, sondern einen internen mpl::l_item-Typ, sodass Sie die gleiche Operation auf beiden Seiten durchführen müssten:

BOOST_MPL_ASSERT((is_same<
      insert_range, begin >::type, result>::type,
      insert_range, begin >::type, sums>::type>));

Alternativ könnten Sie reverse_copy in einen Front-Einfüger verwenden:

BOOST_MPL_ASSERT((is_same<
      reverse_copy >::type>,
      reverse_copy >::type>
      >));

In der Tat, weil front_inserter in Bezug auf die intrinsische Metafunktion push_front implementiert ist, ergibt dies denselben Typ wie insert_range.

Es ist jedoch einfacher, sich einfach darauf zu verlassen, dass copy immer denselben nicht spezifizierten Sequenztyp zurückgibt:

BOOST_MPL_ASSERT((is_same::type, copy::type>));

Und da copy ein transformierender Algorithmus ist, gibt er denselben Typ wie transform zurück, so dass Sie einfach schreiben können:

BOOST_MPL_ASSERT((is_same::type>));

assert(typeid(copy::type) == typeid(result));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X