Prenons le code suivant, qui définit un modèle d'alias pour être passé comme paramètre de modèle de modèle:Passant modèle alias à la classe de base d'un modèle, il dépend de
template<template<class T> class SomeFoo>
class Base {};
template<class T, class Bar>
class Foo {};
class Bar;
template<class T>
using BarFoo = Foo<T, Bar>;
class Bar : public Base<BarFoo> {};
Cela fonctionne comme prévu. Cependant, si Bar
lui-même est un modèle, cette solution n'est pas possible, car le modèle d'alias dépend de l'instanciation concrète de Bar
. La définition du modèle d'alias à l'intérieur de Bar
n'aide pas non plus, car elle n'est pas encore disponible lorsque la classe de base est donnée. Comme il ne semble pas être possible de définir le modèle d'alias « à la volée » dans la liste des paramètres, le seul travail autour que je pouvais venir avec est de passer Bar
-Base
et définir le modèle d'alias là:
template<template<class T, class Derived> class SomeFooTL, class Derived>
class Base
{
template<class T>
using SomeFoo = SomeFooTL<T, Derived>;
};
template<class T, class Bar>
class Foo {};
template<class S>
class Bar : public Base<Foo, Bar<S>> {};
Ceci est, cependant, très insatisfaisant, car il pourrait y avoir (et sont) d'autres Foo
qui ne dépendent de rien mais T
et sont maintenant obligés de prendre un second paramètre de template inutile.
Est-ce que quelqu'un sait un meilleur moyen d'y parvenir?
Je ne suis pas sûr de l'avoir, mais vous ne pouvez pas passer une classe dans laquelle vous avez un modèle <...> en utilisant type = ...; au lieu de passer un gabarit? – lorro
@lorro Je pense que je vois ce que vous obtenez, je dois penser à travers ... (BTW Qu'est-ce qui n'est pas clair sur la question? Peut-être que je peux le reformuler.) EDIT: Oui, je pense que ça devrait marcher! Faites-en une réponse appropriée et je l'accepterai. – Knoep