Dies ist möglich:Vorlagen Argumente nicht alle Anforderungen erfuellen,
struct A {
//void f(); < not declared in struct A
};
template<typename T>
struct Wrapper {
T t;
void call_f() { t.f(); }
};
int main() {
Wrapper<A> w;
}
Diese zusammengestellt fein, solange w.call_f()
wird nicht aufgerufen. w.call_f()
kann nicht instanziiert werden, da A::f
nicht existiert.
Ich habe eine Situation mit einer solchen Wrapper-Vorlage, die mit verschiedenen T
Typen verwendet wird, die nicht immer alle Teile der Schnittstelle implementieren. (Hauptsächlich, um Code-Duplizierung zu vermeiden).
Dies funktioniert nicht:
struct A {
//using i_type = int; < not declared/defined
};
template<typename T>
struct Wrapper {
using its_i_type = typename T::i_type;
// compile error, even if `i_type` gets never used
};
int main() {
Wrapper<A> w;
}
weder tut dies:
struct A {
//using i_type = int; < not declared/defined
};
template<typename T>
struct Wrapper {
typename T::i_type call_f() { return 0; }
// does not compile, even if `call_f()` is never instantiated
};
int main() {
Wrapper<A> w;
}
Gibt es eine gute Möglichkeit, diese Situationen zu handhaben, ohne viel Code-Duplizierung (wie eine Spezialisierung für Wrapper
, etc.)?
Und wie wärs mit einem 'call_f', die zurückgibt 'i_type'? – aschepler
@Aschepler, dann wird es fehlschlagen. In diesem Fall werde ich entweder 'call_f' eine Template-Member-Funktion machen oder ich werde mit der 'type_trait'-ähnlichen Lösung gehen, die Spezialisierungen beinhaltet. – WhiZTiM
*" Sie haben zwei Optionen [..] 1. [.. ] 2. [..] 3. [..] "* :-) (Ich weiß, Mehrfachbearbeitung). – Jarod42