2017-10-26 19 views
6

Kompakt katlama ifadesini başarılı bir şekilde kullanmaya çalışıyorum. Burada ÖrneğinC++ 17 kat ifade sözdizimi?

çalışan bir olan C++ 17 kod

bir daha kompakt forma tercüme isteyen

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

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

(ara madde Fold_And kullanarak değil), Bu g ++ ve clang ++ derleyiciler hem derlemek için başarısız olduğu gibi görünüşte yasadışı C++.

sorum: Bu foo_compact() yalnızca bir sözdizimi sorun

  • mı? (Sağ biri nedir?)

Ya

  • kat ifade karmaşık subexpressions ile directy kullanılamaz ve biz Fold_And yapı kullanılarak 2 adım yaklaşımdır (foo() kodunu kullanarak daha iyi yapamaz)?

cevap

12

Neredeyse anladınız!

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

Bildirim parantez < sonra ve son > önce: parantez içine lazım ifadeleri katlayın.

+1

Argg ... Bir acemi hatası! Teşekkürler ve gürültü için özür dilerim! –

+2

TIL katlama ifadeleri şablon argümanları olarak kullanılabilir. Benim için büyük bir "duh" anı. – StoryTeller

6

Katlama ifade yüzden parantez gerektirir:

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