1

Я пишу шаблон, который принимает произвольное количество аргументов и находит Boolean AND на этом значении.Pairwise bool и в шаблоне C++

template <bool... Vs> struct meta_bool_and; 

template <bool V> struct meta_bool_and : std::integral_constant<bool, V> {}; 

template <bool V, bool... Vs> 
struct meta_bool_and : std::integral_constant<bool, V && meta_bool_and<Vs...>::value> {}; 

Однако, я не смог составить по следующему сообщения

error: redeclared with 2 template parameters 
struct meta_bool_and : std::integral_constant<bool, V && meta_bool_and<Vs...>::value> {}; 

Как я могу исправить эту проблему?

ответ

4

Вы написали повторное определение вместо частичной специализации. Чтобы предоставить специализацию, вы должны указать, какие свойства вы специализируетесь.

Это будет работать:

#include <type_traits> 

template <bool... Vs> struct meta_bool_and; 

template <bool V> struct meta_bool_and<V> : std::integral_constant<bool, V> {}; 
//         ^^^ 

template <bool V, bool... Vs> 
struct meta_bool_and<V, Vs...> : std::integral_constant<bool, V && meta_bool_and<Vs...>::value> {}; 
//     ^^^^^^^^^^ 

Как улучшения, подумайте, хотите ли вы поддерживать пустую конъюнкцию (обычно определяются как верно). Если да, не специализируйтесь на meta_bool_and<bool>, а на meta_bool_and<> (производный от std::true_type).

1

Поскольку это специализации, их необходимо объявить таковыми. Вы можете также сделать один базовый вариант

template <bool V, bool... Vs> 
struct meta_bool_and : std::integral_constant<bool, V && meta_bool_and<Vs...>::value> {}; 
// made base case 

template <bool V> 
struct meta_bool_and<V> : std::integral_constant<bool, V> {}; 
// specialization ^^^ 
5

В качестве альтернативы, вы можете написать его:

template <bool ... Bs> 
using meta_bool_and = std::is_same<std::integral_sequence<bool, true, Bs...>, 
            std::integral_sequence<bool, Bs..., true>>; 

или C++ 1z:

template <bool ... Bs> 
using meta_bool_and = std::integral_constant<bool, (Bs && ...)>; 
+0

Первый один очень умный. Почти слишком умный для меня ... – 5gon12eder