![](/img/trans.png)
[英]Can I use a constexpr function to run an algorithm on an array at compile time?
[英]Passing a constexpr function to use at compile time
我试图提供一种在编译时生成std::array
的简单方法。 到目前为止,一直想弄清楚在编译时传递constexpr函数的好方法。 我到目前为止发现的解决方法是这样的。
#include <iostream>
#include <array>
namespace a {
constexpr int f(const int & i) { return i * i * i;}
#include "generate_with_function.hpp"
}
int main()
{
auto arr = a::generator<false,10,0>::array;
for (auto i : arr) {
std::cout << i << " ";
}
return 0;
}
这基本上是假设您将定义一个名为f
的函数,并且如果要执行其他函数,则将其包装在一个命名空间中。 我想知道是否有更聪明的方法来传递函数并在编译时使用它。 这也是构成列表的代码。
template <bool B, size_t Count,int ... Nums>
struct generator;
template <size_t Count>
struct generator<false,Count,0>
{
constexpr static std::array<int,Count> array
= generator<false,Count,1,f(0)>::array;
};
template <size_t Count, int Current, int ... Results>
struct generator<false,Count,Current, Results...>
{
constexpr static std::array<int,Count> array
= generator<Current+1==Count,Count,Current+1,f(Current), Results...>::array;
};
template <size_t Count, int Current, int ... Results>
struct generator<true,Count,Current,Results...>
{
constexpr static std::array<int,Count> array{{Results...}};
};
在你问不,我实际上并没有这个真正的需求。
正如@ us2012指出的,我应该具体说明自己希望拥有的东西。
您实际上可以将该函数用作模板参数,在这里称为Gen
:
template <bool B, size_t Count, int Current, int Gen(size_t), int ... Nums>
struct generator;
template <size_t Count, int Current, int Gen(size_t), int ... Results>
struct generator<false,Count,Current, Gen, Results...>
{
constexpr static std::array<int,Count> array
generator<Current+1==Count,Count,Current+1,Gen,
Gen(Current), Results...>::array;
};
template <size_t Count, int Current, int Gen(size_t), int ... Results>
struct generator<true,Count,Current,Gen,Results...>
{
constexpr static std::array<int,Count> array{{Results...}};
};
使用它实际上可以将constexpr函数传递给模板(如果类型完全匹配):
// helper to hide the "internal" template parameters
template <size_t Count, int Gen(size_t)>
struct gen {
constexpr static std::array<int, Count> array = generator<false, Count, 0, Gen>::array;
};
constexpr int f(size_t i) { return i * i * i; }
int main()
{
auto arr = gen<10,f>::array;
for (auto i : arr) {
std::cout << i << " ";
}
return 0;
}
您还可以在Gen(Current)
和Results...
参数之间切换,以获取“正确”数组索引处的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.