
[英]Validation of an std::initializer_list in constexpr context
[英]std::initializer_list within constexpr (lookup tables)
这涉及到我试图解决的问题,已经用constexpr解决了几次查找表 ; constexpr数组和std :: initializer_list
我有一个constexpr函数,它使用运行时太慢,为了我的目的,我想使用查找表,理想情况下我想在运行时和编译时使用相同的函数。
我想出了这个
template<template<size_t>class f, size_t... values>
struct lookup_table{
static constexpr auto lookup(size_t i){
auto my_table = {f<values>::value...};
return *(my_table.begin() + i);
}
};
template<size_t n>
class some_function{
// this is a terrible way to calculate an exponential
static constexpr auto slow_exponential(size_t x){
double y = 1 + ((double)x / 1000000.0);
double retval = 1;
for (int i = 0; i < 1000000; i++)
retval *= y;
return retval;
}
public:
static constexpr double value = slow_exponential(n);
};
int main(int, char**){
using my_table = lookup_table<some_function, 0,1,2,3,4,5,6,7,8,9>;
// test for constexprness
constexpr int x = my_table::lookup(7);
using X = std::integral_constant<int, x>;
std::cout << "enter n" << std::endl;
int n;
std::cin >> n;
std::cout << "exp(" << n << ") = " << my_table::lookup(n) << std::endl;
std::cout << "exp(" << n << ") = " << std::exp(n) << std::endl;
return 0;
}
这与Clang 3.5的编译和工作一样,但我并不是100%确定它实际上是有效的(它不会感觉到constexpr)。 我是否以某种方式误入了未定义的行为?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.