2017-10-26 5 views
6

Ich versuche, kompakter Faltenausdruck ohne Erfolg zu verwenden.C++ 17-fache Ausdruckssyntax?

Denn hier zB ein arbeitet C++ 17-Code

template <bool... B> 
struct Fold_And : std::integral_constant<bool, (B && ...)> 
{ 
}; 

template <bool... B> 
constexpr auto Fold_And_v = Fold_And<B...>::value; 


template <typename V, typename... Vs> 
std::enable_if_t< 
    Fold_And_v<std::is_floating_point_v<V>, 
       std::is_floating_point_v<Vs>...> > 
foo(const V& v, const Vs&...) 
{ 
} 

ich es in eine kompaktere Form zu übersetzen

template <typename V, typename... Vs> 
std::enable_if_t<std::is_floating_point_v<V> && ... && 
       std::is_floating_point_v<Vs> > 
foo_compact(const V& v, const Vs&...) 
{ 
} 

jedoch (nicht die Zwischen Fold_And verwenden), Dies ist anscheinend illegales C++, da sowohl g ++ - als auch clang ++ - Compiler es nicht kompilieren können.

Meine Frage:

  • ist es nur ein Syntaxproblem in foo_compact()? (Was ist die richtige?)

Oder

  • fach Ausdruck kann nicht directy mit komplexen Teilausdrücke verwendet werden, und wir können nicht besser als mit dem 2 Stufe-Ansatz (foo() Code mit dem Fold_And struct)

Antwort

12

Sie haben es fast geschafft! Falten Sie Ausdrücke von Klammern umgeben sein müssen:

template <typename V, typename... Vs> 
std::enable_if_t<(std::is_floating_point_v<V> && ... && 
       std::is_floating_point_v<Vs>)> 
foo_compact(const V& v, const Vs&...) 
{ 
} 

Beachten Sie die Klammern nach < und vor dem letzten >.

+1

argG ... Ein Anfänger-Fehler! Danke und Entschuldigung für den Lärm! –

+2

TIL-Faltungsausdrücke können als Vorlagenargumente verwendet werden. Ein großer "Duh" -Moment für mich. – StoryTeller

6

Falten Ausdruck erfordert Klammer, so:

(std::is_floating_point_v<V> && ... && std::is_floating_point_v<Vs>)