Ich versuche, ein Programm eine Möglichkeit zum Hinzufügen neuer Objekte zu einer Variante in einer Bibliothek zur Verfügung stellen, aber ich stoße auf einige kryptische Fehler.Erweitern Boost-Variante mit einer MPL-Liste
#include <boost/mpl/copy.hpp>
#include <boost/mpl/joint_view.hpp>
#include <boost/mpl/list.hpp>
#include <boost/variant/variant.hpp>
struct InternalType1 {};
struct InternalType2 {};
template <typename LocalTypes>
struct Foo
{
typedef boost::mpl::list<
InternalType1,
InternalType2
> Types;
typename boost::make_variant_over<
typename boost::mpl::joint_view<
Types,
LocalTypes
>::type
>::type container_;
// typename boost::make_variant_over<
// typename boost::mpl::copy<
// LocalTypes,
// boost::mpl::back_inserter<Types>
// >::type
// >::type container_;
};
struct LocalType1 {};
struct LocalType2 {};
int main()
{
typedef boost::mpl::list<
LocalType1,
LocalType2
> Types;
Foo<Types> foo;
}
Durch ein mpl::joint_view
mit (was ich nehme an, wenn der effizienteste Weg, um dies zu erreichen), erhalte ich folgende Fehlermeldung:
/usr/local/include/boost/mpl/clear.hpp:29:7: error: implicit instantiation of undefined template
von dem anderen Versuch uncommenting, mit mpl::copy
, und es ersetzen mit den ursprünglichen, dann den Fehler Änderungen:
/usr/local/include/boost/mpl/aux_/push_back_impl.hpp:40:9: error: no matching function for call to 'assertion_failed'
Welche interessanter~~POS=TRUNC hat die following comment:
Keiner dieser Fehler macht mir einen Sinn, denn ich sehe nicht, welche Vorlagen nicht vollständig sind und für die zweite, welche push_back-Spezialisierung verwende ich nicht?
Das zweite ist recht einfach zu verstehen, [ ' mpl :: list'] (http://www.boost.org/libs/mpl/doc/refmanual/list.html) kann nicht mit 'push_back' verwendet werden. Sie können 'boost :: mpl :: front_inserter' verwenden oder einfach einen 'mpl :: vector' in Ihrem' Typ' typedef verwenden. –
llonesmiz
Aaaah, ja, das war's. Vielen Dank! Ich werde die Frage offen lassen, weil die Lösung von joint_view wahrscheinlich die bessere ist oder die zwei, die in der Produktion zu tun sind. –
Ich sehe keinen besseren Weg, wenn Sie 'make_variant_over' nicht ändern wollen. 'mpl :: copy' von 'mpl :: vector's ist der Weg, wenn Sie mich fragen – sehe