2017-10-08 1 views
0

Est-il possible de déclarer une fonction de modèle en utilisant un pointeur de modèle de classe? Quelque chose comme ceci:C++ 11/14/17: pointeur de modèle de modèle en tant que paramètre de modèle

template <typename FirstType, typename ... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template <int n, template <typename FirstType, typename ... TypesRemaining> typename MyClass<FirstType, TypesRemaining...>::*ptr> myFunction() { 
    // ... 
} 

Est-il possible d'utiliser 'using' pour déclarer le type de pointeur? Quelque chose comme ceci:

template <typename FirstType, typename ... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template<typename FirstType, typename ... TypesRemaining> 
using ptrMyClass = MyClass<FirstType, TypesRemaining...>*; 

template <int n, template <typename FirstType, typename ... TypesRemaining> typename ptrMyClass<FirstType, TypesRemaining...> ptr> myFunction() { 
    // ... 
} 
+0

Quel est le problème si vous essayez de le faire ce? – user0042

+0

Tout le code ci-dessus ne compile pas. Je n'arrive pas à comprendre comment faire la bonne syntaxe pour atteindre quelque chose d'équivalent. – Aesope

Répondre

1

Vous pouvez faire quelque chose comme ça (compile très bien avec clang, donne ICE avec gcc):

template <typename FirstType, typename... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template<int n, auto ptr> class 
myFunction_impl; 

template 
< 
    int n 
, typename FirstType 
, typename... TypesRemaining 
, MyClass<FirstType, TypesRemaining...> * ptr 
> class 
myFunction_impl<n, ptr> 
{ 
    public: static void 
    impl(void) 
    { 
     // ... 
    } 
}; 

template<int n, auto ptr> auto 
myFunction(void) 
{ 
    return(myFunction_impl<n, ptr>::impl()); 
} 

int main() 
{ 
    myFunction<0, static_cast<MyClass<int, int, int> *>(nullptr)>(); 
    return 0; 
} 

Online compiler link

+0

Merci pour cette réponse. J'ai oublié de dire que je suis coincé avec Visual Studio (2017 au moins). J'ai essayé de compiler votre code et cela ne fonctionne pas avec VS. J'ai reçu un message pour la classe myFunction_impl que la déclaration de modèle est "déclaration/définition de modèle non reconnaissable" (je suppose que le paquet de paramètres n'est pas à la fin). Aussi, j'aimerais mieux comprendre votre solution. Pourquoi avez-vous besoin d'une classe intermédiaire pour la mise en œuvre? Merci encore pour votre temps. – Aesope

+0

Malheureusement, VS ne supporte pas encore les dernières normes. L'implémentation de classe intermédiaire permet de définir une spécialisation partielle en déduisant "FirstType" et "TypesRemaining" qui n'est pas possible pour les fonctions. Si vous n'en avez pas vraiment besoin, la classe intermédiaire n'est pas nécessaire. – VTT