Angenommen std::vector
hatte keine value_type
. Ist es möglich, eine Vorlage zu schreiben, um die value_type
abzuleiten? Oder allgemeiner ausgedrückt, wie kann ich unter der T<X>
X
ableiten?Wie bekomme ich den Template-Parameter eines Template-Template-Parameters?
Ein sehr naiv ..
template <template <typename X> T>
void test(T<X> t) {
X x;
}
wird wahrscheinlich jemand machen, der ein wenig weiß über Vorlagen an meinem törichten Versuch, lachen und wenn wie folgt instanziiert:
int main() {
std::vector<int> x;
test(x);
}
erstellen die folgenden Fehler:
error: expected ‘class’ before ‘T’
template < template<typename X> T>
^
error: ‘X’ was not declared in this scope
void test(T<X> u) {
^
error: template argument 1 is invalid
void test(T<X> u) {
^
In function ‘void test(int)’:
error: ‘X’ was not declared in this scope
X x;
^
error: expected ‘;’ before ‘x’
X x;
^
In function ‘int main()’:
error: no matching function for call to ‘test(std::vector<int>&)’
test(x);
^
note: candidate is:
note: template<template<class X> class T> void test(int)
void test(T<X> u) {
^
note: template argument deduction/substitution failed:
note: cannot convert ‘x’ (type ‘std::vector<int>’) to type ‘int’
EDIT: der erste ist einfach zu beheben, aber die Befestigung wird nicht beeinflussen die o thers ...
PS: Ich denke, ich habe ein kleines Missverständnis, als std::vector<int>
ist nicht eine Vorlage, sondern ein konkreter Typ. Trotzdem würde ich gerne wissen, ob es einen Weg gibt, die int
von einem someTemplate<int>
mit etwas Vorlagenmagie zu bekommen.
Wenn ich richtig erinnere, Sie müssen 'class' mit verschachtelten Vorlagen verwenden. Etwas wie 'Vorlage Klasse T>'. –
pingul
Beachten Sie, dass 'std :: vector' einen zweiten (voreingestellten) Template-Parameter hat. – Jarod42
Art der Arbeit, aber wenn Sie nur mit Containern arbeiten, können Sie einen Iterator dazu bekommen und 'std :: iterator_traits' verwenden. – NathanOliver