【发布时间】:2018-11-12 21:08:00
【问题描述】:
我正在尝试使用 boost hana 在编译时生成函数。这是我写的代码
#include <boost/hana/transform.hpp>
#include <array>
template<int i>
double f(double x)
{
return x * i;
}
int main()
{
constexpr std::array arr = {1,5,10,100,500};
constexpr auto functions = hana::transform(arr,
[](const int a) -> double (*)(double)
{
return f<a>;
}
);
}
编译时出现 f 不能转换为 double (*)(double) 类型的错误。
我认为问题在于 a 不是 constexpr(这是不可能的,因为它是一个函数参数)。有没有办法让它工作?
【问题讨论】:
-
不,没有办法用运行时值实例化模板。
-
但是数组在编译时是已知的...
-
如果你写了一个
constexpr函数并使用它而不是你的lambda,那会很有趣。这可能有效(我不知道 constexpr 愿意反省多远)。 Aslo 是hana::transformconstexpr?可能不会…… -
@galik - “这可能行得通” - 你试过了吗?如果
a值(用于f<a>的值)通过模板参数传递,则应该可以工作,constexpr或不constexpr。但是,如果a作为普通参数传递,则在constexpr函数内也不应该起作用,因为constexpr函数也可以在运行时调用。 -
Lambdas 也可以是 constexpr 所以这没有区别
标签: c++ templates metaprogramming