2017-10-26 36 views
6

Próbuję użyć zwartej krotnie wyrażenie bez powodzenia.C++ składnia wyrażeń 17-krotnie?

Na przykład o to pracy C++ 17 kod

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&...) 
{ 
} 

chcę przełożyć je na bardziej zwartej formie (nie używając pośredni Fold_And)

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&...) 
{ 
} 

jednak jest to najwyraźniej nielegalne C++, ponieważ kompilatory g ++ i clang ++ nie mogą go skompilować.

Moje pytanie:

  • jest to tylko problem składni w foo_compact()? (Co jest słuszne?)

Albo

  • krotnie wyrażenie nie może być stosowany directy złożonych podwyrażeń i nie możemy zrobić lepiej niż przy użyciu podejścia 2 etapy (foo() kod używając Fold_And struct)?

Odpowiedz

12

Prawie masz! Krotnie wyrażeń mają być otoczone nawiasami:

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&...) 
{ 
} 

zauważy nawiasy po < i przed ostatnią >.

+1

Argg ... błędem początkujących! Dzięki i przepraszam za hałas! –

+2

Wyrażenia składane TIL mogą być używane jako argumenty szablonu. Ważny moment dla mnie. – StoryTeller

6

Fold ekspresja wymaga nawiasów, więc:

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