2017-09-18 2 views
1

Je travaille comme TA dans une classe qui enseigne DirectX 11 et le problème actuel est le tableau D3D11_INPUT_ELEMENT_DESC qui génère la mise en page d'entrée. L'instructeur le considère moche et "proche du matériel". De l'avis de l'instructeur, il devrait y avoir une fonction propre et jolie, nous pouvons simplement fournir notre structure de vertex et obtenir une mise en page d'entrée appropriée. J'essaye d'écrire cette fonction. J'ai fait quelques recherches et le consensus général est que, parce que C++ n'a pas de réflexion, ce n'est pas directement possible, mais il existe une solution de contournement laide (dans une certaine mesure) en utilisant des macros et booster phoenix. Malheureusement, je n'ai pas accès à Boost. Ma limitation technologique est C++, Visual Studios Community 2017, le SDK Windows 10 et le SDK DirectX 11 de juin 2010. Je réalise que DirectX est déjà inclus avec le SDK de Windows, mais il y a quelques utilitaires que nous voulons depuis la version de juin 2010.Utilisation de modèles pour itérer sur les champs de structure au moment de la compilation

Il est évident que je ne peux pas écrire une fonction d'exécution pour effectuer cette tâche, mais qu'en est-il d'une fonction de compilation avec des modèles. Toutes les sources que j'ai trouvées jusqu'ici ont parlé de l'exécution et je n'ai pas encore découvert une source parlant d'itération à travers les champs de structure à la compilation. J'ai une certaine expérience avec les modèles, mais pas assez pour savoir si c'est possible ou non, et encore moins comment commencer. J'espérais que quelqu'un ici pourrait avoir une idée.

Ceci est ma solution idéale:

struct Vertex 
{ 
    XMFLOAT3 pos; 
    XMFLOAT3 col; 
    XMFLOAT3 norm; 
    . 
    . 
    . 
}; 

const char*[] bindings = { 
    "POSITION", 
    "COLOR", 
    "NORMAL", 
    . 
    . 
    . 
}; 

//Takes a struct as template and a list of semantic bindings to create 
//an array of D3D11_INPUT_ELEMENT_DESCs for runtime processing. 
template <typename T> 
constexpr D3D11_INPUT_ELEMENT_DESC* processStruct(const char** semantics) 
{ 
    //what do I put here? 
} 

D3D11_INPUT_ELEMENT_DESC* layoutDescriptor = processStruct<Vertex>(bindings); 
+0

Si vous souhaitez que les membres itérables pourquoi ne pas utiliser un 'std :: vECTOR' /' std :: array' si elles sont du même type ou un 'std :: tuple' si elles doivent être différentes ? – NathanOliver

+0

Le meilleur que vous obtiendrez pour itérer sur des membres sans réflexion dans la langue est quelque chose comme la bibliothèque magic_get. – chris

+0

Un itérable de pointeurs de membres vous rapproche ... s'ils ont tous le même type ('XMFLOAT3') ... – cdhowie

Répondre

0

Il est pas clair pour moi comment vous allez construire le D3D11_INPUT_ELEMENT_DESC en utilisant le Vertex-Structor et des chaînes de liaison. Néanmoins, l'essai suivant peut vous aider à atteindre votre objectif:

#include <thread> 
#include <iostream> 

const char* bin[] = { 
    "pos", 
    "col", 
    "normal", 
    "other" 
}; 

class desc { 
    public: 
    constexpr desc() : desText(0){} 
    constexpr desc(const char * str): desText(str) {} 
    constexpr desc operator+(const desc) { return *this; } 
    void printName() { std::cout << desText << std::endl;} 
    const char* desText; 
}; 

const int ARRAY_SIZE = 4; 

template <int N, int I=N-1> 
class Table : public Table<N, I-1> 
{ 
public: 
    static const desc dummy; 
}; 

template <int N> 
class Table<N, 0> 
{ 
public: 
    static const desc dummy; 
    static desc array[N]; 
}; 

template <int N, int I> 
const desc Table<N, I>::dummy = Table<N, 0>::array[I] = desc(bin[I]) + Table<N, I-1>::dummy; 

template <int N> 
const desc Table<N, 0>::dummy = Table<N, 0>::array[0] = desc(bin[0]); 

template <int N> 
desc Table<N, 0>::array[N]; 

template class Table<ARRAY_SIZE>; 

int main(int, char**) 
{ 
    for (int i=0; i < ARRAY_SIZE; ++i) 
     Table<ARRAY_SIZE>::array[i].printName(); 
} 

Il convertit la liste se liant à un tableau de classes desc.

live example

+0

Ce n'est pas exactement ce que je veux, mais c'est suffisant pour me lancer. Je vous remercie. –