Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

21.03.2018, 15:43

C++ | Über Parameterpack iterieren

Hi,
ich habe eine Klasse/Struktur wie folgt:

C-/C++-Quelltext

1
2
template<class... TClasses>
struct some_class{};


Ich möchte für jeden Templateparameter eine template-Funktion aufrufen etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
template<class... TClasses>
struct some_class{
    std::bitset<max_classes> mask;

    some_class(){
        for(auto _class : TClasses){
            std::size_t pos = get_pos<_class>();
            mask.set(pos, true);
        }
    }
};


Leider weiß ich nicht wie ich das anstellen soll und anscheinend suche ich mit den falschen Schlüsselbegriffen auf Google.
Kann mir jemand einen Tipp geben?

LG Julien
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

2

21.03.2018, 16:13

Mit C++17 kannst du das einfach rekursiv mit if constexpr erledigen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <typeinfo>
#include <string>

template<class T, class... Rest>
void a()
{
    std::cout << typeid(T).name() << ' ';
    
    if constexpr(sizeof...(Rest) > 0)
        a<Rest...>();
}

int main()
{
    a<int, float, std::string>();
}

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

3

21.03.2018, 16:33

Top! Danke dir!

Ich habe überhaupt nicht an Rekursion gedacht.

Endergebnis:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace internal{

    template<class TClass, class... TRest>
    void determine_mask(std::bitset<max_classes>& key_mask){
        size_t pos = get_id<TClass>();
        key_mask.set(pos, true);

        if(sizeof...(TRest) > 0) // Bin auf C++11 beschränkt
            determine_mask<TRest...>(key_mask);
    }

    template<class TClasses...>
    struct system{
        std::bitset<max_classe> key_mask;

        system(){
            determine_mask<TClasses...>(key_mask);
        }
    };

}


LG Julien
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

21.03.2018, 19:28

Oder in C++ 17 auch einfach per Fold Expression:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template<class... TClasses>
struct some_class
{
    some_class()
    {
        (my_func<TClasses>(), ...);
    }
};

;)

5

21.03.2018, 19:41

Stimmt, die gibts ja auch noch :hmm:

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

22.03.2018, 20:33

Sonst ist der Standardweg wohl das Rekursive Entfalten mittels

Quellcode

1
template struct Bla<EinParam, Rest...> : public Bla<Rest...> { }
. Die paar Lösungen, die ich bisher gesehen habe, verpacken ihre Parameterliste in einen std::tuple, für den es dann diverse Helferfunktionen gibt, um Anzahl und einzelne Parameter zu extrahieren.

Die Lösung mit if constexpr ist aber auch cool, die muss ich mir merken.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

22.03.2018, 23:53

Ja, if constexpr macht diese Dinge sehr viel einfacher... :)

Werbeanzeige