[SOLVED] Make the compiler deduce the parameter of a function before compilation

Issue

Here is an example of my problem.

#include <stdio.h>

//template<std::size_t A> <-- Tried to solve the problem by using template
void func1(const int power){
    const int length = 1 << power;
    int twoDArrayA[length][length];

    for (int j = 0; j < power; j++)
    {
        /* Code */
    }
}

int main() {
    func1(4);
    func1(3);
    func1(2);
}

I wonder if I could somehow allow the compiler to deduce parameter power in func1 before it compiles. So instead of compiles one function, it compiles 4 functions in the format of func1 with different power value.

The reason for this is because I would like to use Vitis HLS to unroll the loop and partition the matrix so that it could be implemented onto a FPGA, where a variable-length loop or array cannot work properly.

Solution

You can do this with a template, but you’ve got the wrong syntax. It should be:

template<std::size_t power>
void func1(){
    const std::size_t length = 1 << power;
    int twoDArrayA[length][length];
    ...
}

int main() {
    func1<4>();
    ...
}

Note that your variable length array (VLA) is legal C++ if length is a compile-time constant (as it is here). Nevertheless, std::array would be a better bet.

PS: Thanks for telling us why you want to do this. That was a nice touch.

Answered By – Paul Sanders

Answer Checked By – Terry (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *