Vous devez utiliser un paramètre de modèle de modèle:
template <template <class> class matrixform, class input_T>
class Layer { /* ... */ };
Remarque que, afin d'utiliser un paramètre de modèle de modèle, le templat e fourni en tant qu'argument doit avoir des paramètres qui correspondent exactement à la liste. Ainsi, dans cet exemple, seul un modèle prenant un paramètre de type peut être utilisé pour instancier Layer
.
Ceci est un problème, d'autant plus qu'un paramètre de modèle de classe peut avoir un argument par défaut. La classe Boost identity_matrix
, par exemple, a deux paramètres de modèle: le type et l'allocateur à utiliser, donc il n'a pas pu être utilisé pour instancier Layer
(le paramètre allocator a un argument par défaut). Ce que vous pouvez faire à la place est de prendre comme modèle le modèle instancié à utiliser, et obtenir le input_T
à partir d'un typedef défini par ce type. Par exemple:
template <typename MatrixT>
class Layer
{
typedef typename MatrixT::value_type ValueT;
};
MatrixT
ici est ce que matrixform<input_T>
est dans votre exemple, et ValueT
est votre input_T
.
Cela peut être instancié comme,
Layer<identity_matrix<double> > mylayer;
+1, vous étiez 10 secondes plus vite. :) –
pouvez-vous expliquer ce qu'il y a dans la classe? –
@ismail: Qu'est-ce que vous ne comprenez pas exactement? (Et, pourquoi est-ce que taper "s'il vous plaît" est si difficile?) –