C++11: Compile Time Calculation of Array

前端 未结 7 2098
长发绾君心
长发绾君心 2020-11-28 05:25

Suppose I have some constexpr function f:

constexpr int f(int x) { ... }

And I have some const int N known at compile time:

Either<

7条回答
  •  长情又很酷
    2020-11-28 06:01

    Boost.Preprocessor can help you. The restriction, however, is that you have to use integral literal such as 10 instead of N (even be it compile-time constant):

    #include 
    
    #include 
    
    #define VALUE(z, n, text) f(n)
    
    //ideone doesn't support Boost for C++11, so it is C++03 example, 
    //so can't use constexpr in the function below
    int f(int x) { return x * 10; }
    
    int main() {
      int const a[] = { BOOST_PP_ENUM(10, VALUE, ~) };  //N = 10
      std::size_t const n = sizeof(a)/sizeof(int);
      std::cout << "count = " << n << "\n";
      for(std::size_t i = 0 ; i != n ; ++i ) 
        std::cout << a[i] << "\n";
      return 0;
    }
    

    Output (ideone):

    count = 10
    0
    10
    20
    30
    40
    50
    60
    70
    80
    90
    

    The macro in the following line:

    int const a[] = { BOOST_PP_ENUM(10, VALUE, ~) }; 
    

    expands to this:

    int const a[] = {f(0), f(1), ... f(9)}; 
    

    A more detail explanation is here:

    • BOOST_PP_ENUM

提交回复
热议问题