我想知道在 C++11 中是否可以在编译时使用运行时甚至编译时限制条件进行 for 循环?我从一个愚蠢的尝试开始,找出我需要什么。
for (uint32_t i = 0; i < n; ++i)
{
templated_func<i>();
}
考虑我有一个带有私有成员变量 n 的类,我想调用一个具有不同编号的模板函数,该函数从 0 到 n 迭代(对于运行时限制条件)我已经研究过“模板元编程”和“Constexpr If”(c++17)但我没有得到任何结果,有人可以帮助我吗?
我想知道是否有可能在编译时有一个 for 循环和运行时甚至在 c++11 中的编译时限制条件
我不知道在运行时条件下使用此类循环的合理方法。
使用编译时条件...如果您至少可以使用 C++14,则可以使用基于std::integer_sequence
/ std::make_integer_sequence
(请参阅 Caleth 答案)或std::index_sequence
/ std::make_index_sequence
(稍微综合一点)的解决方案。
如果您受限于 C++11,您可以为std::index_sequence
/创建一个代理,std::make_index_sequence
或者您可以创建一个带有静态函数的递归模板结构(不幸的是,您可以部分特化模板函数,但您可以部分特化类和结构)。
我的意思是......如下
template <std::size_t I, std::size_t Top>
struct for_loop
{
static void func ()
{
templated_func<I>();
for_loop<I+1u, Top>::func();
}
};
template <std::size_t I>
struct for_loop<I, I>
{ static void func () { } };
你可以打电话
constexpr auto n = 10u;
for_loop<0, n>::func();
如果您想templated_func()
使用从零到n-1u
.
不幸的是,此解决方案是递归的,因此您可能会遇到编译器递归限制的问题。那就是......只有在n
不高时才有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句