成对的 bool 和在 c++ 模板中
Pairwise bool and in c++ template
我正在编写一个模板,它接受任意数量的参数并在这些值上找到布尔值 AND。
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> {};
我该如何解决这个问题?
你写了一个重新定义而不是偏特化。为了提供专业化,您必须指定您擅长的属性。
这将起作用:
#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> {};
// ^^^^^^^^^^
作为改进,考虑是否要支持空连词(通常定义为 true)。如果是这样,请不要专注于 meta_bool_and<bool>
,而是专注于 meta_bool_and<>
(源自 std::true_type
)。
由于这些是专业化,因此需要这样声明。您也可以将其中一个设为基本案例
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 ^^^
作为替代,你可以这样写:
template <bool ... Bs>
using meta_bool_and = std::is_same<std::integer_sequence<bool, true, Bs...>,
std::integer_sequence<bool, Bs..., true>>;
或者在 c++17 中:
template <bool ... Bs>
using meta_bool_and = std::integral_constant<bool, (Bs && ...)>;
我正在编写一个模板,它接受任意数量的参数并在这些值上找到布尔值 AND。
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> {};
我该如何解决这个问题?
你写了一个重新定义而不是偏特化。为了提供专业化,您必须指定您擅长的属性。
这将起作用:
#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> {};
// ^^^^^^^^^^
作为改进,考虑是否要支持空连词(通常定义为 true)。如果是这样,请不要专注于 meta_bool_and<bool>
,而是专注于 meta_bool_and<>
(源自 std::true_type
)。
由于这些是专业化,因此需要这样声明。您也可以将其中一个设为基本案例
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 ^^^
作为替代,你可以这样写:
template <bool ... Bs>
using meta_bool_and = std::is_same<std::integer_sequence<bool, true, Bs...>,
std::integer_sequence<bool, Bs..., true>>;
或者在 c++17 中:
template <bool ... Bs>
using meta_bool_and = std::integral_constant<bool, (Bs && ...)>;