C++:比较variadic unsigned int templates参数的帮助器

Vin*_*ent 0 c++ helpers variadic-templates c++11

在混合CRTP,可变参数模板,元编程和运算符重载的类中,我想比较两个可变的unsigned int模板参数,以便进行一些静态断言.我认为辅助结构将是一个很好的方法,但我不知道如何做到这一点.我想到了一些形式:

template<unsigned int... TDIM, unsigned int... TDIM0> struct HelperCheckDimensions
{
    static const bool ok = /* SOMETHING */
};
Run Code Online (Sandbox Code Playgroud)

其中TDIMTDIM0是两个参数,我想比较.它允许我输入:

static_assert(HelperCheckDimensions<TDIM..., TDIM0...>::ok, "ERROR : Dimensions are different !");
Run Code Online (Sandbox Code Playgroud)

我希望结果只有在sizeof...(TDIM)==sizeof...(TDIM0)AND 时才为真TDIM[0] == TDIM0[0], TDIM[1] == TDIM0[1], ..., TDIM[n] == TDIM0[n].

怎么做 ?

非常感谢你.

Naw*_*waz 5

我会说这种形式的类variadic-template没有意义:

template<unsigned int... TDIM, unsigned int... TDIM0> 
struct HelperCheckDimensions
{
    //..
};
Run Code Online (Sandbox Code Playgroud)

它没有意义,因为如果我这样写:

HelperCheckDimensions<1,2,3,4,5,6> z;
Run Code Online (Sandbox Code Playgroud)

那么什么TDIMTDIM0应该是什么?编译器应该如何对参数进行分区?

它是否正确:

TDIM = (1,2)
TDIM0 = (3,4,5,6)
Run Code Online (Sandbox Code Playgroud)

或者这是正确的:

TDIM = (1)
TDIM0 = (2,3,4,5,6)
Run Code Online (Sandbox Code Playgroud)

或这个:

TDIM = (1,2,3,4)
TDIM0 = (5,6)
Run Code Online (Sandbox Code Playgroud)

希望这有助于为什么它没有意义.


来自你的评论:

非常好点!但我的问题仍然存在......也许某种形式template<unsigned int... TDIM, typename TFAKE, unsigned int... TDIM0>可行?什么是最好的解决方案?

那么标准不允许这种形式的模板定义:

template<unsigned int... TDIM, typename TFAKE, unsigned int... TDIM0>
Run Code Online (Sandbox Code Playgroud)

我不知道为什么标准不允许它,即使它对我有意义,至少在这种情况下(可能它增加了语言的不值得的复杂性).根据标准,template-parameter-pack必须是模板定义的最后一个参数.

如果您在GCC中编译上面的代码,它会给出以下错误:

错误:参数包'TDIM'必须位于模板参数列表的末尾

希望有所帮助.

  • 非常好点!但我的问题仍然存在......可能是表单模板<unsigned int ... TDIM,typename TFAKE,unsigned int ... TDIM0>会有效吗?什么是最好的解决方案? (2认同)