constexpr中的std :: initializer_list(查找表)

时间:2015-05-12 11:09:14

标签: c++ c++14 constexpr

这与我试图解决的问题有关,已经解决了几次 Lookup table with constexpr; constexpr array and 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)。我是否以某种方式误入了未定义的行为?

0 个答案:

没有答案