C++ - Vorlagen: erhalten Art des Elements
Gibt es zwei Strukturen:
template <typename T>
struct AB
{
T a, b;
AB <T> ( ) : a ( 0.0 ), b ( 0.0 ) {}
};
template <typename T>
struct ABList
{
typedef std::list < AB <T> > Type;
typedef T Type2;
};
und eine Funktion
template <typename List>
void test ( List l )
{
List::iterator i_l = l.begin();
//Here *i_l type is needed instead of double
double val = (*il).a;
}
Gibt es eine Möglichkeit, wie man *i_l templatized Typ (hier double), ich.e,
std::list::Item type
ohne dabei andere parameter, wenn
int main(int argc, char* argv[])
{
ABList <double> ::Type intervals;
test (intervals);
return 0;
}
Danke für Eure Hilfe, C++ 03 ist bevorzugt.
Aktualisiert, Frage
Wenn ein templatized Typ
std::list::Item type
ist eine formale Parameter von test(), diese Lösung
template <typename List>
void test ( List l, typename List::value_type::value_type val )
{
...
}
int main(int argc, char* argv[])
{
ABList <double> ::Type intervals;
double x = 7.0;
test <ABList<double>> (intervals, x);
return 0;
}
funktioniert nicht... folgender Fehler tritt auf:
error C2770: invalid explicit template argument(s)
Version
test (intervals, x);
bewirkt, dass ein weiterer Fehler:
Failed to specialize function template 'void test(List,List::value_type::{ctor})'
- Nicht genau sicher, was du meinst. Möchten Sie
std::list::value_type
. - Eine weitere Möglichkeit: schreiben Sie eigene type_traits für Sie Arten.
- lösen Sie die explizite template-Argumente für die test-Funktion, versuchen Sie den Aufruf nur test(Intervalle, x) in main() und lassen Sie "template argument Abzug" finden Sie die richtige Entsprechung für die Funktion. Ich habe versucht, und es kompiliert ohne Probleme
- tomislav: das auslassen einer Spezialisierung bewirkt, dass das scheitern Spezialisierung Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
typedef
dem template-parameter T in der Struktur und verwendenstd::list::value_type
um den Typ gespeichert, die in der Struktur AB, wenn Sie nicht mit C++11:In C++11, verwenden Sie einfach
auto
:Und wenn Sie brauchen, um zu finden, dass Typ später, können Sie
decltype(val)
.In C++03, können Sie die zugrunde liegende Typ für einen standard-container Typ
L
als:Also in deinem Fall sollte es sein:
In deinem Fall, allerdings würde ihm der Typ
AB
, und nicht der Typ, derAB::a
. Wenn Sie brauchen, um in der Lage abrufen, die zur compile-Zeit den TypT
für eine Instanz derAB
Vorlage, die Sie benötigen, um irgendeine Art alias innerhalbAB
. Zum Beispiel:Dann könnten Sie tun:
Wenn Sie nicht wollen, zu ändern, die definition von
AB
nur für diesen Zweck, können Sie eine separate type-Eigenschaft, wie die folgenden:Könnte man dann die zugrunde liegenden Typ
T
vonAB<T>
wie unten gezeigt: