2017-06-13 4 views
2

In C++ 11, std::enable_if wurde der Standardbibliothek hinzugefügt. Es entspricht boost::enable_if_c, deren Zustand bool ist. Dies ist für ziemlich einfache Bedingungen geeignet, aber sobald Sie Prädikate verwenden, die ihr Ergebnis in einer value Konstanten enthalten, müssen Sie das ausführlichere Konstrukt my_predicate<MyArgs>::value verwenden, um es in bool umzuwandeln. Dies ist genau das, was für boost::enable_if (ohne _c Suffix) gemacht wurde.Warum gibt es kein Äquivalent zu boost :: enable_if?

Warum gibt es keine Entsprechung in der Standardbibliothek?

+2

'typename my_predicate :: value' was? –

+0

für etwa vergleichbar mit [diese] (https://blogs.msdn.microsoft.com/ericlippert/2009/06/22/why-doesnt-c-implement-top-level-methods/) – Caleth

+0

Sorry, my bad. Ich habe eine Mischung zwischen Metafunktionen gemacht, die Typen zurückgeben, und denen, die Werte zurückgeben. –

Antwort

3

Die Standardbibliothek geht hier einen anderen Weg. C++ 17 hat für alle Typeigenschaften, die eine zurückgeben, Variablenvorlagenverknüpfungen hinzugefügt. Das Muster ist immer

template <typename... Args> 
some_trait_v = some_trait<Args...>::value; 

Zum Beispiel Sie

std::enable_if<std::is_same_v<T1,T2>> 

Ferner das Argument für enable_if könnte das Ergebnis constexpr Ausdrücke sein, zum Beispiel

std::enable_if<some_constexpr_function<T1,T2>()> 

Auf diese Weise ist allgemeinerer schreiben und hängt nicht davon ab, etwas zu übergeben, das ein value Mitglied haben muss.

+0

Guter Punkt mit 'constexpr'! Dies ist ein überzeugendes Argument, um diese Entscheidung zu rechtfertigen. –

Verwandte Themen