Ich untersuche ein Stroustroups Buch "C++ Programmierung 4. Edition". Und ich versuche seinem Beispiel im Matrix-Design zu folgen.Brauchen Sie Hilfe, um Template-Funktion mit komplexen typename Parameter zu verstehen
Seine Matrix-Klasse hängt stark von Vorlagen ab und ich versuche mein Bestes, um sie herauszufinden. Hier ist eines der Hilfsklassen für diese Matrix
A Matrix_slice der Teil der Matrix-Implementierung ist, dass die Karten eine Reihe von Indizes an die Stelle eines Elements. Es nutzt die Idee allgemeiner Scheiben (§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
Hier sind die Linien, die das Thema meiner Frage aufbauen:
template<typename... Dims,
typename = Enable_if<All(Convertible<Dims,size_t>()...)>>
size_t operator()(Dims... dims) const; // calculate index from a set of subscripts
früher in dem Buch er beschreibt, wie Enable_if und All() implementiert werden:
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...);
}
Ich habe genug Bildung verstehen, wie sie funktionieren bereits und bei seiner Enable_if Implementierung ich auf der Suche als auch Cabrio-Funktion ableiten kann:
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;
}
So kann ich die Bausteine dieser Vorlage Funktionsdeklaration under aber ich bin verwirrt, wenn sie versuchen zu verstehen, wie sie alt arbeiten. Ich hoffe, dass Sie
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
helfen könnte Also, was tun wir am Ende bekommen? Dieses Konstrukt
template<typename ...Dims,typename = Enable_if<true>>
size_t operator()(Dims... dims) const;
Die Fragen sind:
- wir die zweite Vorlageargument für Enable_if
- Warum haben wir Zuordnung ('=') für einen Typname
- Sie nicht brauchen Was bekommen wir am Ende?
Update: Sie den Code in dem gleichen Buch überprüfen, die ich Referenzierung hier The C++ Programming Language 4th edition auf Seite 841 (Matrix Design)
Dies kann kein echter Code sein. 'Enable_if() ...)>' löst einen Compilerfehler aus, da das Template-Argument nur ein zur Kompilierzeit bekannter Ausdruck sein kann. Ein Rückgabewert von 'All' ist nicht. –
SergeyA
@SergeyA Ich nehme an, er hat gerade einen 'constexpr' vor den Funktionsdefinitionen vermisst. Ich bin mir ziemlich sicher, dass es funktionieren wird. – SirGuy
@GuyGreer, OP könnte. Aber als was sonst fehlt OP? ;) – SergeyA