Implementierung C ++ 14 make_integer_sequence
Habe ich versucht zu implementieren, die C++14 alias Vorlage make_integer_sequence
das vereinfacht die Erstellung der Vorlage-Klasse integer_sequence
.
template< class T, T... I> struct integer_sequence
{
typedef T value_type;
static constexpr size_t size() noexcept { return sizeof...(I) ; }
};
template< class T, T N>
using make_integer_sequence = integer_sequence< T, 0,1,2, ... ,N-1 >; //only for illustration.
Umzusetzen make_integer_sequence
wir benötigen einen Helfer, Struktur make_helper
.
template< class T , class N >
using make_integer_sequence = typename make_helper<T,N>::type;
Umsetzung make_helper
ist nicht allzu schwer.
template< class T, T N, T... I >
struct make_helper
{
typedef typename mpl::if_< T(0) == N,
mpl::identity< integer_sequence<T,I...> >,
make_helper< T, N-1, N-1,I...>
>::type;
};
Testen make_integer_sequence
ich diese main-Funktion:
int main()
{
#define GEN(z,n,temp) \
typedef make_integer_sequence< int, n > BOOST_PP_CAT(int_seq,n) ;
BOOST_PP_REPEAT(256, GEN, ~);
}
Ich das Programm kompiliert mit GCC 4.8.0, auf einem quad-core-i5-system mit 8GBs RAM.
Erfolgreiche Zusammenstellung dauerte 4 Sekunden.
Aber wenn ich mich verändert die GEN-makro:
int main() {
#define GEN(z,n,temp) \
typedef make_integer_sequence< int, n * 4 > BOOST_PP_CAT(int_seq, n) ;
BOOST_PP_REPEAT(256, GEN, ~ );
}
Die Kompilation nicht erfolgreich war, und ausgeben der Fehlermeldung:
virtual memory exhausted.
Kann jemand erklären, diesen Fehler, und was verursacht es?
EDIT:
Ich vereinfacht den test:
int main()
{
typedef make_integer_sequence< int, 4096 > int_seq4096;
}
Ich dann erfolgreich kompiliert mit GCC 4.8.0 -ftemplate-depth=65536.
Jedoch dieser zweite test:
int main()
{
typedef make_integer_sequence< int, 16384 > int_seq16384;
}
Nicht kompilieren mit GCC 4.8.0 -ftemplate-depth=65536, und die zu dem Fehler geführt:
virtuellen Speicher erschöpft.
So, meine Frage ist, wie kann ich abnehmen Vorlage tiefen Instanziierung?
Grüße,
Hurşit.
InformationsquelleAutor der Frage Khurshid | 2013-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ein
log N
- Implementierung, die nicht sogar brauchen, ein erhöhtes max-Tiefe für template-Instanziierungen und stellt ziemlich schnell:InformationsquelleAutor der Antwort Xeo
Dies ist im Grunde mich, hacking rund um Xeo-Lösung: Making community wiki - wenn dankbar, bitte upvote Xeo.
...gerade geändert, bis ich spürte, es könnte nicht einfacher, umbenannt und Hinzugefügt
value_type
undsize()
pro Standard (aber nur tunindex_sequence
nichtinteger_sequence
), und der code, arbeiten mit GCC 5.2-std=c++14
laufen konnte, sonst unverändert unter älteren/anderen Compilern bin ich stecken mit. Sparen kann jemand einige Zeit /Verwirrung.Hinweise:
die "Magie" der Xeo-Lösung ist in der Erklärung der
_merge_and_renumber
(concat
in seinem code) mit genau zwei Parameter, während die specilisation effektiv setzt Ihre individuellen parameter packsden
typename
...::type
...vermeidet die Fehler:
InformationsquelleAutor der Antwort
Fand ich sehr schnell und unnötig Tiefe Rekursion version der Umsetzung von
make_index_sequence
. In meinem PC kompiliert mit N = 1 048 576 , 2, s.(PC : Centos 6.4 (x86, i5, 8 Gb RAM, gcc-4.4.7 -std=c++0x -O2 -Wall).
InformationsquelleAutor der Antwort Khurshid
Ihnen fehlen
-1
hier:insbesondere:
Nächsten, die erste Niederlassung sollte nicht
integer_sequence<T>
sonderninteger_sequence<T, I...>
.die genug sein sollte, um Ihre original-code zu kompilieren.
Im Allgemeinen, beim schreiben von ernst
template
metaprogramming, Ihr Hauptziel sollte es sein, dass die Tiefe dertemplate
Instanziierung nach unten. Ein Weg, um über dieses problem nachzudenken ist, vorstellen, haben Sie einen unendlich-thread computer: jeder unabhängige Berechnung sollte schlurfte auf seinen eigenen thread, dann schlurfte zusammen am Ende. Sie haben ein paar Operationen dauern O(1) Tiefe, wie...
ausbau: exploit.In der Regel, ziehen von logarithmischer Tiefe ist ausreichend, da mit einem
900
Tiefe, die es erlaubt2^900
große Strukturen, und etwas anderes bricht ersten. (Um fair zu sein, was eher passieren wird 90 verschiedenen Schichten der2^10
große Strukturen).InformationsquelleAutor der Antwort Yakk - Adam Nevraumont
Hier ist eine andere, etwas allgemeinere Variante von Xeo's logarithmische Antwort, die bietet
make_integer_sequence
für beliebige Typen. Dies wird durch die Verwendungstd::integral_constant
um zu vermeiden, die gefürchtete "template argument beinhaltet die Vorlage den parameter" Fehler.Demo: coliru
InformationsquelleAutor der Antwort joki
Einfache Implementierung O(N). Wahrscheinlich nicht das, was Sie wollen, für große N, aber meine Anwendung ist nur für den Aufruf von Funktionen mit indizierten Argumente, und ich würde nicht erwarten, dass eine stelligkeit von mehr als etwa 10. Ich habe Sie nicht gefüllt, wie die Mitglieder integer_sequence. Ich freue mich über eine standard-Bibliothek Implementierung und nuking 🙂
InformationsquelleAutor der Antwort cdyson37