C++:比较可变参数无符号 int 模板参数的帮助程序
C++ : a helper to compare variadic unsigned int templates parameters
在一个混合了CRTP,可变参数模板,元程序和运算符重载的类中,我想比较两个可变参数无符号int模板参数,以便进行一些静态断言。我认为辅助结构是执行此操作的好方法,但我不知道该怎么做。我想到了以下形式:
template<unsigned int... TDIM, unsigned int... TDIM0> struct HelperCheckDimensions
{
static const bool ok = /* SOMETHING */
};
其中TDIM
和TDIM0
是我要比较的两个参数。它将允许我输入:
static_assert(HelperCheckDimensions<TDIM..., TDIM0...>::ok, "ERROR : Dimensions are different !");
我希望只有当sizeof...(TDIM)==sizeof...(TDIM0)
和TDIM[0] == TDIM0[0], TDIM[1] == TDIM0[1], ..., TDIM[n] == TDIM0[n]
时,结果才是真的。
怎么办呢?
谢谢。
我会说这种形式的类变奏模板没有意义:
template<unsigned int... TDIM, unsigned int... TDIM0>
struct HelperCheckDimensions
{
//..
};
这没有意义,因为如果我写这个:
HelperCheckDimensions<1,2,3,4,5,6> z;
那么TDIM
和TDIM0
应该是什么?编译器应该如何对参数进行分区?
这是正确的吗:
TDIM = (1,2)
TDIM0 = (3,4,5,6)
或者这是正确的:
TDIM = (1)
TDIM0 = (2,3,4,5,6)
或者这个:
TDIM = (1,2,3,4)
TDIM0 = (5,6)
希望这有助于为什么它没有意义。
从您的评论中:
非常好的观点!但我的问题仍然悬而未决...也许
template<unsigned int... TDIM, typename TFAKE, unsigned int... TDIM0>
形式的东西会起作用?最好的解决方案是什么?
那么标准不允许此表单的模板定义:
template<unsigned int... TDIM, typename TFAKE, unsigned int... TDIM0>
我不知道为什么标准不允许它的原因,即使它对我来说是有意义的,至少在这种情况下(也许它增加了语言不值得的复杂性)。根据标准,模板参数包必须是模板定义的最后一个参数。
如果你在GCC中编译上面的代码,它会给出这个错误:
错误:参数包"TDIM"必须位于模板参数列表的末尾
希望有帮助。
假设您的主模板如下所示:
template <int ...> struct Foo;
您现在可以制作Foo
比较器:
template <typename, typename> struct FooCmp : std::false_type { };
template <int A, int B, int ...As, int ...Bs>
struct FooCmp<Foo<A, As...>, Foo<B, Bs...>>
: std::integral_constant<bool, A == B && FooCmp<Foo<As...>, Foo<Bs...>>::value>
{ };
template <> struct FooCmp<Foo<>, Foo<>> : std::true_type { };
用法:
typedef Foo<1, 3, 4> F1;
typedef Foo<9, 5, 1> F2;
template <typename S, typename T>
std::enable_if<FooCmp<S, T>::value> do_magic(S s, T t) { /* ... */ }
do_magic(F1{}, F2{});
主类模板不能有两个参数包,需要使用一些包包装器
template<unsigned int...T> struct intPack;
template<typename T, typename Y> struct HelperCheckDimensions;
template<unsigned int lhs, unsigned int...T, unsigned int rhs, unsigned int...Y> struct HelperCheckDimensions<intPack<lhs,T...>, intPack<rhs, Y...>>
{
static const bool value = lhs==rhs && HelperCheckDimensions<intPack<T...>, intPack<Y...>>::value;
};
template<unsigned int lhs, unsigned int rhs> struct HelperCheckDimensions<intPack<lhs>, intPack<rhs>>
{
static const bool value = lhs==rhs;
};
测试:http://liveworkspace.org/code/200e10548f3fc589f39401ca0b22e7c8
- C++调用具有 *this 属性的单个帮助程序函数
- 用于检查值是否为其任何参数的帮助程序函数
- 类型限定宏帮助程序
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 无法将 2D 数组传递到 c++ 中的帮助程序函数中
- C2783: 无法推断帮助程序函数的模板参数
- 友元函数需要一个帮助程序函数
- 在何处放置与类方法相关的帮助程序函数C++
- 给定概念,SFINAE 帮助程序是否仍在规范中作为未弃用?
- 使用 IP 帮助程序的 Windows 中活动 UDP 连接的远程地址
- 如何安装性能数据帮助程序
- 编写一个将 LLVM IR 文件作为命令行参数的程序
- 从带有参数的C++程序中调用shell脚本
- 用于向公众公开数据成员的帮助程序结构
- 类参数化与类和帮助程序函数混淆
- 仅具有公共静态方法的帮助程序类
- 命令行参数执行C 程序
- Ebpf:帮助程序的未定义符号
- 使用帮助程序模板结构时无法推断模板参数
- C++:比较可变参数无符号 int 模板参数的帮助程序