所以我有一种模板功能
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(){}
};
答案 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>()
对于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 {
// ...
}
};