Gibt es consExpr oder andere Kompilierzeitäquivalente zu den STL-Funktions- und anderen Bibliotheken für die Verwendung mit Metaprogrammierung? Genauer gesagt, versuche ich einige Metaprogramme zu schreiben, die SFINAE verwenden, um bestimmte Bedingungen zu bewerten und die entsprechenden Typen zu generieren. Beispiel:C++ STL-funktionale Entsprechungen für Metaprogrammierung
template<int A, int B>
enable_if_t<(A < B)> my_func() {// do something
}
template<int A, int B>
enable_if_t<!(A < B)> my_func() {// do nothing
}
Idealerweise würde ich der Benutzer gerne in der Lage sein, in einem Komparator passieren (wie std::less<int>
), eher als schwer zu <
Codierung. So etwas wie:
template<int A, int B, class comp = std::less<int>>
enable_if_t<comp(A, B)> my_func() {// do something
}
template<int A, int B, class comp = std::less<int>>
enable_if_t<comp(A, B)> my_func() {// do nothing
}
Da jedoch die funktionalen Objekte sind nicht konstante Ausdrücke, werden sie nicht bei der Kompilierung ausgewertet zu werden und so funktioniert das nicht. Was wäre der richtige Weg, um so etwas zu implementieren?
'enable_if_t'? –
cpplearner
Das funktioniert nicht. Der Compiler beschwert sich: Nicht-Typ Vorlage Argument ist kein konstanter Ausdruck –
'enable_if_t' ist nur in [C++ 14] definiert (http://en.cppreference.com/w/cpp/types/enable_if). Wie erwarten Sie, dass es mit C++ 11 funktioniert? Hast du es selbst definiert? –