Une approche similaire serait de faire quelque chose comme ceci:
template<int I>
class A {};
template<int I>
class B {};
// Forward declaration.
template<typename T, typename U>
class C;
template<template<int> class TA, template<int> class TB, int I, int J>
class C<TA<I>, TB<J>> {
// J exists only to make sure integer parameters match.
static_assert((I == J), "Template parameters' integer parameters are mismatched.");
private:
TA<I> objA;
TB<I> objB;
public:
// ...
};
// ...
C<A<4>, B<4>> ca4b4; // Valid.
C<A<4>, B<16>> ca4b16; // Static assert fails.
cela vous permettra de garantir que les deux conteneurs ont le même paramètre entier, et émettre un message d'erreur lisible si elles ne le font pas.
Edit: Notez que si vous n'utilisez pas deux paramètres entiers séparés et vérifier manuellement pour l'égalité, en essayant de créer une instance avec des paramètres de modèle de modèle désadaptation dégagera un moins compréhensible « type incomplet » Message d'erreur.
template<template<int> class TA, template<int> class TB, int I>
class C<TA<I>, TB<I>> {
// ...
};
// ...
C<A<4>, B<16>> ca4b16; // Oops.
/* Error messages:
* GCC:
* error: aggregate 'C<A<4>, B<16> > ca4b16' has incomplete type and cannot be defined
* C<A<4>, B<16>> ca4b16;
* ^
* MSVC:
* error C2079: 'ca4b16' uses undefined class 'C<T, U>'
* with
* [
* T=A<4>,
* U=B<16>
* ]
*/
En effet, la définition réelle ne sera en mesure de saisir les cas où les deux paramètres ont le même paramètre entier, et toute utilisation avec des paramètres entiers désadaptation va plutôt se replier sur la déclaration en avant, qui est incomplète. L'utilisation de deux paramètres entiers séparés, puis la vérification manuelle de l'égalité, nous permet d'attraper les mauvaises instanciations au lieu de les laisser tomber sur la déclaration, afin que nous puissions convertir cette erreur générique en quelque chose qui vous dit quel est le problème.
Oui c'est possible – Jarod42