[C++ Boost MPL] gebruik van fold.

Pagina: 1
Acties:

  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
Ik heb een data klasse gemaakt in c++ en nu moet ik @compile-time de gecumuleerde size van de datamembers van die klasse kunnen opvragen. Het concept zit hem in devolgende code.
C++:
1
2
3
4
5
class StudentGrades {
public:
    
    typedef set<int,float,float,float> types;
    typedef fold<types, size_t<0>, plus<_1,sizeof _2 >::type>::type size;


Hij geeft hierop de volgende compile fouten.
StudentGrades.hpp:31: error: template argument 2 is invalid
StudentGrades.hpp:31: error: expected unqualified-id before ‘,’ token

wat doe ik verkeerd?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:10

.oisyn

Moderator Devschuur®

Demotivational Speaker

sizeof wordt direct toegepast op _2 (en niet pas na substitutie) en vertaalt dus naar een size_t, namelijk de grootte van het type genaamd "_2" (wat waarschijnlijk 1 is omdat het een metaclass is en dus geen members heeft)

Verder ben ik niet zo bekend met MPL dus wat je dan wel moet doen kan ik zo 1 2 3 niet zeggen.

.edit: ah, je moet sizeof_<_2> gebruiken :)

[ Voor 30% gewijzigd door .oisyn op 05-06-2008 18:40 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
heb het ondertussen zelf gevonden.

Blijkbaar had ik een nameclash met de size_t van boost en de standaard c++ size_t.
door er boost::mpl::size_t voor te zetten was het probleem opgelost.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:10

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maar als je de fix van mij niet toepast dan werkt het alsnog niet naar behoren (tenminste, ik neem aan dat je de cumulatieve grootte van alle typen wilt weten - nu tel je praktisch het aantal typen, aangezien sizeof _2 altijd gelijk is aan 1).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Uberhaupt snap ik niet helemaal waarom je dit wilt. Dit soort ingewikkelde code kan meestal op een veel makkelijkere (en betere) manier. Je gaat de struct opnieuw uitvinden oid?

  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
dat van de sizeof en sizeof_ de eerste geeft idd een verkeerde oplossing.
waarom ik dat wilde doen.
ik moet alleen de grootte van de datamembers van mijn klasse hebben de rest mag zelfs niet meegeteld worden (is interne keuken).
Bovendien ga je een schoolopdracht niet veranderen komt zo arrogant over bij de prof.

[ Voor 4% gewijzigd door redfox314 op 06-06-2008 20:09 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Moet je voor een school opdracht boost template-meta-programming gebruiken? Cool. Meestal gaan ze niet op dat soort dingen in. Maar dan nog, waarom niet gewoon:

C++:
1
2
3
4
5
6
class X {
struct set {int, float, float, float};
set types;
...
sizeof(X::types) 
}

?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:10

.oisyn

Moderator Devschuur®

Demotivational Speaker

Omdat daar padding bij kan zitten.

Overigens is het een set, dus de floats worden dacht ik maar 1x geteld. Anders moet je een vector gebruiken :)

[ Voor 69% gewijzigd door .oisyn op 06-06-2008 20:24 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
je hebt geen controle over de implementatie van sizeof van een struct.

het leuke is dat je door een specialisatie van sizeof_<T> voor customclass te schrijven je ook dit kan gebruiken
C++:
1
2
typedef set<int,customclass,float> types;
typedef fold<types, boost::mpl::size_t<0> , plus<_1, sizeof_<_2 > > >::type fieldsize;



set is eigenlijk een misnomer. bag zou beter zijn. de essentie is dat het ongeordend is.

ik krijg voor int,float,float,float resultaat 16 (bytes).

[ Voor 78% gewijzigd door redfox314 op 06-06-2008 20:37 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

.oisyn schreef op vrijdag 06 juni 2008 @ 20:23:
Omdat daar padding bij kan zitten.
Ja, ok. #pragma pack(1) is niet echt netjes en portable. Vroeg het me gewoon af.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:10

.oisyn

Moderator Devschuur®

Demotivational Speaker

redfox314 schreef op vrijdag 06 juni 2008 @ 20:26:
set is eigenlijk een misnomer. bag zou beter zijn. de essentie is dat het ongeordend is.
Zoals ik al zei, ik heb nog weinig met MPL gedaan, maar aangezien ze de naamgeving aanhouden van de STL en bovendien in de documentatie staat:
A set may contain at most one element for each key
lijkt me dat wat jij zegt niet klopt. De reden dat jij 16 bytes terugkrijgt is denk ik omdat je de set direct zo instantieert. Ik gok dat als je begint met een lege set en daar 1 int en 3 floats aan toevoegt, dat je dan eindigt met een set van 1 int en 1 float.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
hmz dat ga ik is proberen.

***EDIT***

als je insert gebruikt dan krijg je inderdaad maar een float in je set.

[ Voor 63% gewijzigd door redfox314 op 07-06-2008 16:46 ]

Pagina: 1