J'examine le livre de Stroustroup "Programmation C++ 4ème édition". Et j'essaie de suivre son exemple sur la conception de la matrice. Sa classe matricielle dépend fortement des modèles et je fais de mon mieux pour les comprendre. Voici l'une des classes d'aide pour cette matriceJ'ai besoin d'aide pour comprendre la fonction du template avec les paramètres de type typename complexes
A Matrix_slice est la partie de la mise en œuvre de la matrice qui associe un ensemble de à l'emplacement des indices d'un élément. Il utilise l'idée de tranches généralisées (§40.5.6):
template<size_t N>
struct Matrix_slice {
Matrix_slice() = default; // an empty matrix: no elements
Matrix_slice(size_t s, initializer_list<size_t> exts); // extents
Matrix_slice(size_t s, initializer_list<size_t> exts, initializer_list<siz e_t> strs);// extents and strides
template<typename... Dims> // N extents
Matrix_slice(Dims... dims);
template<typename... Dims,
typename = Enable_if<All(Convertible<Dims,size_t>()...)>>
size_t operator()(Dims... dims) const; // calculate index from a set of subscripts
size_t size; // total number of elements
size_t start; // star ting offset
array<size_t,N> extents; // number of elements in each dimension
array<size_t,N> strides; // offsets between elements in each dimension
};
I
Voici les lignes qui construisent le sujet de ma question:
template<typename... Dims,
typename = Enable_if<All(Convertible<Dims,size_t>()...)>>
size_t operator()(Dims... dims) const; // calculate index from a set of subscripts
plus tôt dans le livre il décrit comment Enable_if et All() sont mis en œuvre:
template<bool B,typename T>
using Enable_if = typename std::enable_if<B, T>::type;
constexpr bool All(){
return true;
}
template<typename...Args>
constexpr bool All(bool b, Args... args)
{
return b && All(args...);
}
J'ai assez dans formation pour comprendre comment ils fonctionnent déjà et en regardant sa mise en œuvre Enable_if je peux en déduire la fonction convertible ainsi:
template<typename From,typename To>
bool Convertible(){
//I think that it looks like that, but I haven't found
//this one in the book, so I might be wrong
return std::is_convertible<From, To>::value;
}
Alors, je peux undersand les éléments constitutifs de cette déclaration de fonction de modèle mais je suis confus en essayant pour comprendre comment ils travaillent altogather. J'espère que vous pourriez aider à
template<typename... Dims,
//so here we accept the fact that we can have multiple arguments like (1,2,3,4)
typename = Enable_if<All(Convertible<Dims,size_t>()...)>>
//Evaluating and expanding from inside out my guess will be
//for example if Dims = 1,2,3,4,5
//Convertible<Dims,size_t>()... = Convertible<1,2,3,4,5,size_t>() =
//= Convertible<typeof(1),size_t>(),Convertible<typeof(2),size_t>(),Convertible<typeof(3),size_t>(),...
//= true,true,true,true,true
//All() is thus expanded to All(true,true,true,true,true)
//=true;
//Enable_if<true>
//here is point of confusion. Enable_if takes two tamplate arguments,
//Enable_if<bool B,typename T>
//but here it only takes bool
//typename = Enable_if(...) this one is also confusing
size_t operator()(Dims... dims) const; // calculate index from a set of subscripts
Alors qu'avons-nous à la fin? Cette construction
template<typename ...Dims,typename = Enable_if<true>>
size_t operator()(Dims... dims) const;
Les questions sont les suivantes:
- Ne nous avons besoin le deuxième argument de modèle pour Enable_if
- Pourquoi nous avons affectation ('=') pour un typename
- Qu'obtenons-nous à la fin?
Mise à jour: Vous pouvez vérifier le code dans le même livre que je fais référence ici The C++ Programming Language 4th edition à la page 841 (matrice Design)
Ceci ne peut pas être un vrai code. 'Enable_if() ...)>' déclenchera l'erreur du compilateur, puisque l'argument template ne peut être qu'une expression connue au moment de la compilation. Une valeur de retour de 'All' ne l'est pas. –
SergeyA
@SergeyA Je suppose qu'il manque juste un 'constexpr' devant les définitions de fonctions. Je suis à peu près sûr que ça va fonctionner. – SirGuy
@GuyGreer, OP pourrait. Mais qu'est-ce que l'OP manque d'autre? ;) – SergeyA