der Hierarchie Gegeben:Muss ich Vorlagen Spezialisieren Wenn ihr rechtswidriges Code ist in einer if (false)
struct base {};
struct a : public base {};
struct b : public base {};
Ich möchte vector<base*> vecBase
und vector<a*> aVec
mit dieser Funktion füllen:
template <typename T>
void foo(T* bar) {
if (is_base_of_v<decltype(baseVec)::value_type, T>) baseVec.push_back(static_cast<decltype(baseVec)::value_type>(bar));
if (is_base_of_v<decltype(aVec)::value_type, T>) baseVec.push_back(static_cast<decltype(aVec)::value_type>(bar));
}
Die Problem hier ist, dass, obwohl die static_cast
nie durchgeführt wird, wenn es legal ist; wie diese Anrufe nicht kompiliert:
int myInt;
b myB;
foo(&myInt);
foo(&myB);
Ich weiß, dass ich foo
spezialisieren kann. Ist das, was ich hier tun muss, oder gibt es eine Möglichkeit, den Compiler auf die Tatsache zu kippen, dass die anstößigen static_cast
s nie passieren werden?
„statisch, wenn“ nicht der Fall ist (noch) nicht unterstützt, so dass alle Filialen gültig sein sollte. – Jarod42
@ Jarod42 Mein Herz springt vor Freude ... ist "static if" in unserer Zukunft? –
Bezogen auf http://stackoverflow.com/questions/13799420/why-there-is-no-static-if-in-c11 – Jarod42