如何使用int参数迭代模板函数?

时间:2018-03-16 07:20:08

标签: c++ template-meta-programming

所以我有一种模板功能 template<int i> task();
如果需要,您也可以将其视为具有相应构造函数的类型 template<int i> struct task{ task();}; 我想在一段时间内迭代i。 意思是, task<0>(); task<1>(); ... task<ConstantVal>(); 此外,我想使用类似的样式,就像写任何通常的for循环,也就是说,我想避免每次遇到类似的情况时创建一个模板类。相反,我想使用一个模板,比如template<int s, int j, class callable> struct ForLoop;,只需应用ForLoop<s,t,taskTemplate>()之类的内容 但它要求我将模板作为参数传递,这在法律上是非法的。这些迭代问题是否有一些解决方法?
以下是一些解决方法。但我不认为这是一个很好的解决方案,原因我上面提到过。

template<int s, int t>
struct ForLoop{
    ForLoop(){
        task<s>(); ForLoop<s+1,t>::ForLoop();
    }
};
template<int s>
struct ForLoop<s,s>{
    ForLoop(){}
};

1 个答案:

答案 0 :(得分:1)

您可以使用类似(C ++ 14)的内容:

template <std::size_t ... Is, typename F>
void ForEachIndex(std::index_sequence<Is...>, F&& f)
{
    int dummy[] = {0, /* Handles empty Is. following cast handle evil operator comma */
                   (static_cast<void>(f(std::integral_constant<std::size_t, Is>())), 0)...};
    static_cast<void>(dummy); // avoid warning for unused variable
}

template <std::size_t N, typename F>
void ForEachIndex(F&& f)
{
    ForEachIndex(std::make_index_sequence<N>(), std::forward<F>(f));
}

用法:

const auto start = 42;
ForEachIndex<4>([&](auto i){ task<start + i()>(); }); // task<42>(), .., task<45>()

Demo

对于C ++ 11:

  • 可以找到make_index_sequence / index_sequence的实施。
  • 泛型lambda应该被旧的仿函数替换:

    struct MyFunctor {
        template <std::size_t I>
        void operator()(std::integral_constant<std::size_t, I>) const {
            // ...
        }
    };