2016-05-31 18 views
1

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?

+5

„statisch, wenn“ nicht der Fall ist (noch) nicht unterstützt, so dass alle Filialen gültig sein sollte. – Jarod42

+0

@ Jarod42 Mein Herz springt vor Freude ... ist "static if" in unserer Zukunft? –

+2

Bezogen auf http://stackoverflow.com/questions/13799420/why-there-is-no-static-if-in-c11 – Jarod42

Antwort

1
  1. static if ist was du suchst. Es wurde ursprünglich von N3329 on Jan-10-'12 vorgeschlagen.

  2. On Mar-16-'13 Bjarne Stroustrup, Gabriel Dos Reis, and Andrew Sutton put forward N3613 in dem es hieß von static if:

Dieser Vorschlag würde als gutes viel mehr schaden. Sprachfunktionen, die diese Probleme angehen, dürfen die Sprache und unsere Fähigkeit, Tools darum herum zu erstellen, nicht negativ beeinflussen. Wir kommen zu dem Schluss, dass die zukünftige Entwicklung von static if aufgegeben werden sollte und stattdessen Alternativen wie der "concepts-lite" -Ansatz verfolgt werden sollten.

  1. Die C++ Chicago Meeting am Sep-23-'13 die Konzepte Studiengruppe stellte fest, dass sie weren't including static if in their scope for the near future.

  2. Das Chicago Meeting hat Laich Vereinfachung Ville Voutilainen von static if: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4461.html

  3. Die C++ Lexena Sitzung am Mai-4-'15 diskutieren tat die Vereinfachung und encouraged the original authors to come back to the C++ Kona meeting on Oct-19-'15

  4. In dem C++ Kona Meeting Herb Sutter personally presented static if . Er erzählt, dass

Das Feedback im Raum, auch Bjarne, aus der Sicht darin potenziell interessiert war: Das ist der einzige Weg sein, eine Version von Konzepten/Konzepten Lite in C zu erhalten ++ 17. Es gibt keinen anderen Weg, wie wir Konzepte oder ähnliches in diese große Überarbeitung des Standards aufnehmen können. Das sind also frühe Tage, aber es wurde präsentiert. Es gibt ein gewisses Interesse. Wir müssen jetzt weitermachen und diese Dinge brauchen Zeit und mehrere Zyklen, aber es wird vorgeschlagen.


Aber jetzt wirst du Ihre Vorlagen haben sich zu spezialisieren:

template <typename T> 
enable_if_t<negation_v<is_base_of<base, T>>, void> push(T*) {} 

void push(base* i) { 
    baseVec.push_back(static_cast<decltype(baseVec)::value_type>(i)); 
} 

void push(a* i) { 
    baseVec.push_back(static_cast<decltype(baseVec)::value_type>(i)); 
    aVec.push_back(static_cast<decltype(aVec)::value_type>(i)); 
}