C++ 如何检查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; };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的类型定义模板,然后将其“分解”为
部分模板专门化可能有助于您: 诀窍是首先用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中保存向量类型的实际结构
模板结构相同;//