C++ 如何检查mpl::vector_c中的值?

C++ 如何检查mpl::vector_c中的值?,c++,boost,metaprogramming,C++,Boost,Metaprogramming,如有需要,请选择以下尺寸: 如果N包含0或1以外的数字,则向二进制模板添加错误检查将导致编译错误 通过标准功能即可轻松实现: 样板 结构二进制{ 静态_assertN==0 | | N==1,二进制必须为0或1; 常数int n=n; }; 但是如何通过mpl::vector_c实现呢?例如: 使用值=mpl::vector\u c; 样板 结构二进制{ 常数int n=n; }; 部分模板专门化可能有助于您: 诀窍是首先用int N和mpl::vector_c的类型定义模板,然后将其“分解”为

如有需要,请选择以下尺寸:

如果N包含0或1以外的数字,则向二进制模板添加错误检查将导致编译错误

通过标准功能即可轻松实现:

样板 结构二进制{ 静态_assertN==0 | | N==1,二进制必须为0或1; 常数int n=n; }; 但是如何通过mpl::vector_c实现呢?例如:

使用值=mpl::vector\u c; 样板 结构二进制{ 常数int n=n; };
部分模板专门化可能有助于您:

诀窍是首先用int N和mpl::vector_c的类型定义模板,然后将其“分解”为您想要访问的组件(在本例中是由vector_c组成的两个整数)。下面您可以找到一个例子,它适用于正好有两个参数的向量_c。您还可以将其扩展到处理任意数量的参数,这可能是一个有趣的第二个练习:可以使用参数包实现

#include <boost/mpl/vector_c.hpp>

using namespace boost;
using values = mpl::vector_c<int, 1, 1>;

template <int N, typename T> struct Binary;
template <int N, typename t, long a, long b> struct Binary<N, boost::mpl::vector_c<t, a, b>> {
  static_assert(N == a && b == N, "invalid vector_c");
};

int main() {
  //Binary<1, boost::mpl::vector_c<int, 1, 2>> koo; // commented out as assertion fails
  Binary<1, values> kooo;
}
您可能会发现有趣的相关链接:


请注意,此解决方案不适用于标准部分模板专门化可能有助于您:

诀窍是首先用int N和mpl::vector_c的类型定义模板,然后将其“分解”为您想要访问的组件(在本例中是由vector_c组成的两个整数)。下面您可以找到一个例子,它适用于正好有两个参数的向量_c。您还可以将其扩展到处理任意数量的参数,这可能是一个有趣的第二个练习:可以使用参数包实现

#include <boost/mpl/vector_c.hpp>

using namespace boost;
using values = mpl::vector_c<int, 1, 1>;

template <int N, typename T> struct Binary;
template <int N, typename t, long a, long b> struct Binary<N, boost::mpl::vector_c<t, a, b>> {
  static_assert(N == a && b == N, "invalid vector_c");
};

int main() {
  //Binary<1, boost::mpl::vector_c<int, 1, 2>> koo; // commented out as assertion fails
  Binary<1, values> kooo;
}
您可能会发现有趣的相关链接:

请注意,此解决方案不适用于建筑顶部的标准, 下面,您可以通过使用enable_if找到使用SFINAE的解决方案,如问题中所示

这比我最初预期的要复杂一些,因为部分模板专门化中为boost::mpl_vector_c提供的参数数量与mpl::vector的大小不匹配

因此,我在下面定义了一个helper结构,它允许对提供的布尔值可变模板的子集执行布尔“and”操作

如果c++17可用,则可以更改注释c++14/c++17标记的行。 如果c++14不可用,例如,可以通过使用struct中的递归值声明和分别由[…]::value/type替换的_v/_t后缀来替换索引序列

包括 包括 ///Helper结构,用于计算布尔集合子集的连接。 模板结构partialconjunce; ///壁模板特化 样板 结构部分关联 :std::积分常数< bool,std::getstd::forward_as_tupleb…&&&…>{}; ///值的“别名” 模板constexpr自动部分连接= partialconjunce::value; ///如果满足条件,则在::type中保存向量类型的实际结构 模板结构相同;//构建在, 下面,您可以通过使用enable_if找到使用SFINAE的解决方案,如问题中所示

这比我最初预期的要复杂一些,因为部分模板专门化中为boost::mpl_vector_c提供的参数数量与mpl::vector的大小不匹配

因此,我在下面定义了一个helper结构,它允许对提供的布尔值可变模板的子集执行布尔“and”操作

如果c++17可用,则可以更改注释c++14/c++17标记的行。 如果c++14不可用,例如,可以通过使用struct中的递归值声明和分别由[…]::value/type替换的_v/_t后缀来替换索引序列

包括 包括 ///Helper结构,用于计算布尔集合子集的连接。 模板结构partialconjunce; ///壁模板特化 样板 结构部分关联 :std::积分常数< bool,std::getstd::forward_as_tupleb…&&&…>{}; ///值的“别名” 模板constexpr自动部分连接= partialconjunce::value; ///如果满足条件,则在::type中保存向量类型的实际结构 模板结构相同;//