最近我决定制作循环展开器。我的函数从_Beg迭代到_End(这是模板参数),并在每个索引上调用函数_func:
template<size_t _Beg, size_t _End, typename _Func>
typename std::enable_if<_Beg < _End, void>::type
for_r(_Func _func)
{
_func(_Beg);
for_r<_Beg+1, _End>(_func);
}
template<size_t _Beg, size_t _End, typename _Func>
typename std::enable_if<_Beg >= _End, void>::type
for_r(_Func _func)
{}
它的工作原理如下:
for_r<0, 10>([](size_t index){cout << index << endl;});
但是,'index'变量在编译时是已知的,因此在逻辑上可以使用'index'作为lambda中的常量表达式。像这样:
tuple<int, int, int, int> tpl(1, 2, 3, 4);
for_r<0, 4>([&](size_t index){cout << get<index>(tpl) << endl;});
但'index'是可变的,并且不可能将它作为constexpr传递给lambda。有没有办法处理它并实现逻辑行为而不显式地键入循环展开如下:
cout << get<0>(tpl) << endl << get<1>(tpl) << endl << get<2>(tpl) << endl << get<3>(tpl) << endl;