J'essaie de créer un modèle de fonction qui acceptera deux (ou plus) des modèles de classe variée imbriqués listés ci-dessous, en tant qu'arguments, et les placer dans une autre structure de données acceptera différents types (la paire ou le tuple est ce que j'utiliserai probablement). Voici les classes et sous-classes, ainsi que l'utilisation de ma fonction (la fonction est définie plus bas):Accepter des modèles de classe variadique imbriqués comme arguments du modèle de fonction
template<typename... Args> struct Entity {
template<typename... InnerEntArgs> struct InnerEntity {
InnerEntity(InnerEntArgs... inner_ent_args) {
... //do stuff w/ InnerEntArgs pack
... //do stuff that makes Inner dependent on Outer's Args pack
}
};
};
struct ThingA : Entity<int, string> {
... //construct ThingA
};
struct ThingB : Entity<string, string> {
... //construct ThingB
};
auto foo = my_func(
ThingA::InnerEntity<int, int, int>(1, 2, 3)
, ThingB::InnerEntity<string, int>("bar", 1)
);
Voici le code que je bricolé pour la fonction, et il ne compile très bien, mais je Je ne sais pas si la configuration est correcte. Plus précisément, je suis un peu floue sur la façon dont typename
et ::template
sont fait le compilateur heureux dans ce contexte, ou si cette fonction se comportera de la façon dont je me attends:
template<
typename... ArgsA, typename... ArgsAInner
, typename... ArgsB, typename... ArgsBInner
> auto my_func(
typename Entity<ArgsA...>::template InnerEntity<ArgsAInner...> A
, typename Entity<ArgsB...>::template InnerEntity<ArgsBInner...> B
) -> tuple<decltype(A), decltype(B)> {
return make_tuple(A, B);
}
Je pense J'ai un bon saisissez comment les packs de paramètres sont déduits/déduits, et comment auto
, decltype
, et le type de retour arrière font leur chose, mais si je me trompe, s'il vous plaît laissez-moi savoir comment. De plus, si quelqu'un veut démontrer une version variée de cette fonction qui peut accepter n'importe quel nombre de modèles de classes variées imbriqués et les placer dans un conteneur ou une structure de données appropriés, ce serait génial, mais je suis principalement préoccupé de comprendre pleinement typename
et ::template
. Merci d'avance!
* Si j'ai mal écrit ce titre ou si je mélange des termes, veuillez expliquer. :) Je suis ici pour apprendre.
Je vois. Peut-être que je laisse des informations pertinentes ici, je suis encore un peu confus sur pourquoi ce qui précède ne fonctionnerait pas. L'entité a des sous-classes qui définissent ce que serait Args, et elle a une fonction membre pour créer des objets InnerEntity, et cette fonction membre accepte et transmet les arguments pour InnerEntity en tant que pack. Compte tenu de cela, le compilateur ne devrait-il pas être capable de déduire les différents packs Args, puisqu'ils seraient tous connus au moment de la compilation? –
@pheadbaq 'Entity' pourrait être spécialisé pour certains arguments tels que' InnerEntity' est une chose complètement différente de celle des autres arguments.En général, pour un paramètre de fonction de modèle de fonction si vous avez 'typename T :: foo', alors' T' ne peut pas être déduit par ce paramètre. –
Après avoir mâché votre réponse et mon propre code un peu plus, je ne pense pas que la solution friend fonctionnera après tout, parce que ThingA et ThingB (voir mon code édité) n'héritent pas du même modèle Entity. On dirait que le nom de fichier AInner + SFINAE fonctionnerait bien cependant. Merci! –