通用循环 - 使用用户定义的函数展开

时间:2015-05-12 18:32:22

标签: c++ templates lambda

最近我决定制作循环展开器。我的函数从_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;

0 个答案:

没有答案