C++ 循环消除

C++ 循环消除,c++,c++11,C++,C++11,我想在我的C++11程序中使用来消除for循环(类似于强制-funroll循环) 下面是一个例子: template<unsigned...> struct indices { }; template<unsigned M, unsigned... Is> struct indices_gen : indices_gen<M - 1, M - 1, Is...> { }; template<unsigned... Is> struct in

我想在我的C++11程序中使用来消除
for
循环(类似于强制
-funroll循环

下面是一个例子:

template<unsigned...> struct indices
{
};

template<unsigned M, unsigned... Is> struct indices_gen
  : indices_gen<M - 1, M - 1, Is...>
{
};

template<unsigned... Is> struct indices_gen<0, Is...> : indices<Is...>
{
};

template <typename T>
struct example
{
  example()
  {
    assign(indices_gen<3>(), 0);
  }

  template<unsigned... Is, typename U>
  void assign(indices<Is...>, U value)
  {
    [](...){}((array[Is] = value)...);
  }

  T array[3];
};

int main()
{
  example<int> ex;
  return 0;
}
模板结构索引
{
};
模板结构索引
:指数
{
};
模板结构索引\u gen:索引
{
};
模板
结构示例
{
示例()
{
分配(索引_gen(),0);
}
模板
无效分配(索引,U值)
{
[](…){}((数组[Is]=值)…);
}
T阵列[3];
};
int main()
{
示例ex;
返回0;
}
是否可以创建从起始索引
S
到结束索引
E
索引?你能演示一下吗?

试试这个():

模板结构索引{};
模板结构索引
:指数
{};
模板结构索引\u gen:索引
{};
工作示例:


编辑:查看Xeo的评论。上面的示例不检查
S
,因此如果您出错,它可能会变糟。在这种情况下,这(Xeo的代码)将返回一个编译器错误:

当然。我不确定真正的问题是什么。就这么做吧。好吧,我真的不知道如何:)提示?好吧,您当前的结束条件硬编码为0:
struct index\u gen<0,Is…>:
。类似地,步长被硬编码为1:
:index\u gen
感谢Xeo和Pawel,我想知道消除
for
循环是否被视为滥用语言功能:)做得好,尽管这有一个问题,即如果
S>E
由于无休止的递归,编译器会崩溃,因此,我建议使用
static\u assert
(类似于
inherit\u if
用于停止递归模板实例化)。也许你应该提到,这现在表示一个半开放范围
[S,E)
。它是
[S,E]
,但在示例中使用它是很困难的。尽管在第一个链接中它仍然是封闭的。而且你对
S>E
的看法完全正确。
template<unsigned...> struct indices {};

template<unsigned S, unsigned E, unsigned... Is> struct indices_gen
  : indices_gen<S, E-1, E-1, Is...>
{};

template<unsigned S, unsigned... Is> struct indices_gen<S, S, Is...> : indices<Is...>
{};