fonction à contenu spécialisé en fonction du nombre d'arguments passés dans un template
Bonjour,
J'ai le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| void test(Position* p, Motion* m)
{
std::cout << p->x;
std::cout << p->y;
std::cout << m->n;
}
template <typename...Ts>
struct SYSTEM
{
std::vector<Component*> vector;
SYSTEM()
{
vector.push_back(new Position);
vector.push_back(new Motion);
static_cast<Position*>(vector[0])->x = 45;
static_cast<Position*>(vector[0])->y = 2;
static_cast<Motion*>(vector[1])->n = 90;
}
template <typename...Tss>
void castComponents(Tss...args)
{
test(static_cast<Ts*>(args)...);
}
void update()
{
castComponents(vector[0],vector[1]);
}
};
int main()
{
SYSTEM<Position,Motion> e;
e.update();
return 0;
} |
J'aimerais que la fonction castComponent se spécialise en fonction du nombre de type passés dans la construction d'un SYSTEM. Je m'explique. Si, mettons, je construis un SYSTEM<int,char,double>, trois types sont passés, et j'aimerais que castComponent devienne :
Code:
1 2 3 4
| void update()
{
castComponents(vector[0],vector[1],vector[2]);
} |
Idem si je construis un SYSTEM<int,float,std::string,char,double>, 5 types, donc :
Code:
1 2 3 4
| void update()
{
castComponents(vector[0],vector[1],vector[2],vector[3],vector[4]);
} |
Je m'étais dit que j'allais faire de castComponent une fonction template :
Code:
1 2 3 4 5 6 7 8
| template <int n>
void update();
template <>
void update<2>()
{
castComponent(vector[0],vector[1]);
} |
... mais c'est impossible. J'ai aussi essayé de passer par des macro :
Code:
1 2 3 4 5
| #define MACRO(n) MACRO##n
#define MACRO1 vector[0]
#define MACRO2 vector[0],vector[1]
#define MACRO3 vector[0],vector[1],vector[2] |
... mais le MACRO(sizeof...(Ts)) ne passe pas :)
DU COUP je me demandais si un brillant génie pouvait m'aider à résoudre mon problème :mouarf::mouarf:
Merci !