Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Variadic int Template     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
C++11er
Unregistrierter




Beitrag C++11er Unregistrierter 19:59:08 02.06.2012   Titel:   Variadic int Template            Zitieren

Kann man die variadic Templates nicht auch für ints verwenden? Z.B. so

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template<int head, int ... tail>                                                
struct Accumulator {
    static const int result = head + Accumulator<tail...>::result;
};
 
template<int head>
struct Accumulator<head> {
    static const int result = head;
};
 
int
main()
{
    std::cout << Accumulator<1,2,3,4,5>::result << std::endl;
}
C++11er
Unregistrierter




Beitrag C++11er Unregistrierter 20:00:27 02.06.2012   Titel:              Zitieren

Also bei obigem Code heult G++ bei mir herum und spuckt folgende Meldung aus:

Code:
test.cpp:5:57: sorry, unimplemented: cannot expand ‘tail ...’ into a fixed-length argument list
firefly
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.04.2002
Beiträge: 424
Beitrag firefly Mitglied 20:17:58 02.06.2012   Titel:              Zitieren

welche gcc version verwendest du und hast du überhaupt den c++0x (bzw c++11) modus aktiviert?

_________________
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
C++11er
Unregistrierter




Beitrag C++11er Unregistrierter 20:21:31 02.06.2012   Titel:              Zitieren

4.6.3 und ich übersetze mit
Code:
g++ -pedantic -std=c++0x -W -Wall -o test test.cpp
GorbGorb
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.06.2011
Beiträge: 179
Beitrag GorbGorb Mitglied 20:22:55 02.06.2012   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
 
template< int... >
struct Accumulator;
 
template<int head, int ... tail>
struct Accumulator< head , tail... > {
    static const int result = head + Accumulator<tail...>::result;
};
 
template<int head>
struct Accumulator<head> {
    static const int result = head;
};
 
 
int
main()
{
    std::cout << Accumulator<1,2,3,4,5>::result << std::endl;
}

funktioniert bei mir.
Das Problem ist, denke ich, dass dein template nicht mit einem parameter pack anfängt, da es als
C++:
template<int head, int ... tail>                                                
struct Accumulator;

deklariert wurde. Das parameter pack kann der gcc offensichtlich nicht in ein einzelnes Argument packen (wenn das template so deklariert wurde, bei Spezialisierung funktioniert es offensichtlich). Arbeite einfach mit dem workaround den ich gepostet habe.
C++11er
Unregistrierter




Beitrag C++11er Unregistrierter 20:26:46 02.06.2012   Titel:              Zitieren

Danke, damit klappt es!

Was ist ein parameter pack bzw. ein einziges? Sprich, mir ist das Problem nicht ganz klar, das du mit dem Workaround löst.
GorbGorb
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.06.2011
Beiträge: 179
Beitrag GorbGorb Mitglied 20:35:55 02.06.2012   Titel:              Zitieren

C++:
template< int... parameter_pack >

Das ist ein parameter pack. Und beim gcc ist das nicht möglich:
C++:
template< int no_parameter_pack , int... >
struct XY;
 
XY< parameter_pack... > x;

XY hat als erstes Argument kein parameter pack, man übergibt XY aber ein parameter pack. Eigentlich wäre das so möglich, indem das parameter pack aufgesplittet wird (vermutlich, wenn sich der gcc dafür entschuldigt), aber beim gcc wohl noch nicht. Das Problem scheint nur aufzutreten, wenn das template so deklariert wurde, d.h. parameter packs werden bei Spezialisierungen richtig aufgeteilt.
firefly
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.04.2002
Beiträge: 424
Beitrag firefly Mitglied 20:36:41 02.06.2012   Titel:              Zitieren

ok anscheinend ist diese syntax variante des variadic template im gcc 4.6 noch nicht implementiert. Ich kann deinen beispielcode mit clang version 3.2 (svn build) bauen.
Edit: mit gcc 4.7.0 funktioniert es auch.

_________________
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.


Zuletzt bearbeitet von firefly am 22:14:12 02.06.2012, insgesamt 1-mal bearbeitet
c++.de :: C++ (auch C++0x und C++11) ::  Variadic int Template   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.