Ich arbeite an der Aktualisierung einiger C++ - Code, um die neue Funktionalität in C++ 11 zu nutzen. Ich habe eine Merkmalsklasse mit einigen Funktionen, die grundlegende Typen zurückgibt, die meistens, aber nicht immer, einen konstanten Ausdruck zurückgeben würden. Ich würde gerne verschiedene Dinge machen, je nachdem ob die Funktion constexpr
ist oder nicht. Ich kam mit dem folgenden Ansatz auf:Erkennung von conexpr mit SFINAE
template<typename Trait>
struct test
{
template<int Value = Trait::f()>
static std::true_type do_call(int){ return std::true_type(); }
static std::false_type do_call(...){ return std::false_type(); }
static bool call(){ return do_call(0); }
};
struct trait
{
static int f(){ return 15; }
};
struct ctrait
{
static constexpr int f(){ return 20; }
};
int main()
{
std::cout << "regular: " << test<trait>::call() << std::endl;
std::cout << "constexpr: " << test<ctrait>::call() << std::endl;
}
Die zusätzlichen int
/...
Parameter gibt es so, dass, wenn beide Funktionen nach verfügbar sind SFINAE, die erste durch Überlastung Auflösung gewählt wird.
Kompilieren und Ausführen dieser mit Clang 3.2 zeigt:
regular: 0
constexpr: 1
Also das scheint zu funktionieren, aber ich würde gerne wissen, ob der Code legal ist C++ 11. Besonders, da ich davon überzeugt bin, dass sich die Regeln für SFINAE geändert haben.
Interessantes Problem. Ich habe eine Antwort geschrieben, von der ich dachte, dass sie legal ist, aber dann habe ich eine [modifizierte Version] (http://liveworkspace.org/code/SWmBI$5) geschrieben, die laut meiner Antwort und dieser Aussage gleichermaßen gültig sein sollte Kompiliert keinen Compiler. Also werde ich die Antwort nicht einreichen, aber ich bin sehr neugierig. –
Zugehörig: [Ist is_contexpr in C++ 11 möglich?] (Http://stackoverflow.com/questions/13299394/is-is-constexpr-possible-in-c11). Siehe auch [Aufruf von constexpr im Standardvorlagenargument] (http://stackoverflow.com/questions/10721130/calling-constexpr-in-de-default-template-argument). –
@AndyProwl: Ich bin neugierig, könnten Sie vielleicht Ihre Lösung auf liveworkspace.org oder einer anderen ähnlichen Website posten? –