gpt4 book ai didi

c++ - 用 constexpr 迭代

转载 作者:可可西里 更新时间:2023-11-01 17:37:49 25 4
gpt4 key购买 nike

我想写这样的东西:

template<int i> void f() {}

for (constexpr int i : {1,2,3})
{
f<i>();
}

是否可以迭代 constexpr ?

谢谢

最佳答案

正如您可能理解的那样,您不能执行以下操作:

for (constexpr int i : {1,2,3})
{
f<i>();
}

因为,如果i是在循环中从 1 到 3 变化,那么它是一个变量并且不是编译时常量。并且变量不能是模板参数,如 f<i> :只有编译时常量可以作为模板参数。

在 C++11 及更高版本中,感谢 variadic templates ,您可以有效地迭代编译时常量的任意序列通过使用接受合适的任意序列的模板函数的编译时递归模板参数。

如果您还不知道该怎么做,那对您来说几乎没有任何意义。这是一个 C++11 示例,它执行您想要表达的内容:

#include <type_traits>
#include <iostream>

template<int i> void f()
{
std::cout << i << '\n';
}

// This overload is chosen when there is only 1 template argument.
template<int First, int ...Rest>
typename std::enable_if<sizeof...(Rest) == 0>::type
for_each_f()
{
f<First>();
}

// This overload is chosen when there is > 1 template argument.
template<int First, int ...Rest>
typename std::enable_if<sizeof...(Rest) != 0>::type
for_each_f()
{
f<First>();
for_each_f<Rest...>();
}

int main()
{
for_each_f<2,3,5,7,11>();
return 0;
}

See it live

除了可变参数模板之外,该技术还依赖于非常重要的 C++ 元编程原理SFINAE , 和 std::enable_if ,这是标准 C++ 库提供的用于利用 SFINAE 的工具。

101010 的回答展示了一种更复杂、更强大的风格C++14 中可用的解决方案(并且很容易在 C++11 中实现如果您编写一些支持样板文件)。

关于c++ - 用 constexpr 迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43202791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com