2017-10-26 35 views
6

Tôi đang cố gắng sử dụng biểu thức gấp gọn gàng mà không thành công.C++ 17 cú pháp biểu thức gấp?

Ví dụ ở đây là một làm việc C++ 17 đang

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

Tôi muốn dịch nó thành một hình thức nhỏ gọn hơn (không sử dụng các trung gian 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&...) 
{ 
} 

Tuy nhiên, điều này rõ ràng là bất hợp pháp C++ vì cả trình biên dịch g ++ và clang ++ đều không biên dịch được.

Câu hỏi của tôi:

  • là nó chỉ là một vấn đề cú pháp trong foo_compact()? (Một trong những quyền là gì?)

Hoặc

  • biểu lần không thể được sử dụng directy với subexpressions phức tạp và chúng ta không thể làm tốt hơn so với sử dụng phương pháp 2 bước (foo() mã sử dụng Fold_And struct)?

Trả lời

12

Bạn gần như đã hiểu! Gấp biểu được bao quanh bởi dấu ngoặc đơn:

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

Chú ý các dấu ngoặc đơn sau < và trước khi cuối cùng >.

+1

Argg ... Một lỗi mới bắt đầu! Cảm ơn và xin lỗi vì tiếng ồn! –

+2

Biểu thức TIL fold có thể được sử dụng làm đối số mẫu. Một khoảnh khắc "duh" lớn đối với tôi. – StoryTeller

6

biểu Fold đòi hỏi ngoặc, vì vậy:

(std::is_floating_point_v<V> && ... && std::is_floating_point_v<Vs>) 
Các vấn đề liên quan