Можно ли использовать массив constexpr произвольного размера в качестве наблюдений в операторе switch? - PullRequest
0 голосов
/ 18 января 2020

Можно ли использовать массив constexpr переменного размера в операторе switch, чтобы каждый аргумент [i] был регистром? или являются ли if-заявления единственным решением.

constexpr int arr[] = {35, 2, 234, 42, ..., N}; // <------ Random ints
constexpr int size = sizeof(arr)/sizeof(arr[0]); // <----arbitrary number of elements in array

// want to achieve something like this
switch (var) {
case inArray(var): /* Checks if the var is in the array. Cannot be done at 
                    compile time due to runtime var. Thats why I was looking for a workaround where the switch accepted a range of array values
then expanded it automatically upon compilation */


// other cases

}

Извините, просто чтобы уточнить Я ищу функцию, похожую на «диапазоны падежей», которая предоставляется некоторыми компиляторами, когда они создают для вас операторы падежей. Я знаю, что компилятор будет знать размер во время компиляции. В моем приложении этот размер будет часто меняться. Я отредактировал мой код выше, чтобы лучше отразить логи c, к которым я иду.

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Да, но размер массива должен быть правильно вычислен
Например, var составляет 99

constexpr int arr[] = {35, 2, 234, 42, 99, 67}; // <------ Random ints
constexpr int size = sizeof(arr) / sizeof(int) ; // <----arbitrary number of elements in array

int var = 99;

// want to achieve something like this

switch (var) {
case arr[0]:{
    cout<< "0"<<"\n";
    break;
}
case arr[1]:{
    cout<< "1"<<"\n";
    break;
}
case arr[4]:{
    cout<< "4"<<"\n";
    break;
}
case arr[size-1]:
    cout<< size-1 <<"\n";
    break;

}
0 голосов
/ 18 января 2020

Последний VS2019 со стандартным набором для последних принимает следующий код:

constexpr int arr[]{ 5, 6, 7, 35 };
constexpr int sizeArr{ sizeof(arr) / sizeof(arr[0]) };
void foo(int v)
{
    switch(v) {
        case arr[0]
        : break;
            case arr[1]
            : break;
                case arr[2]
                : break;
                case arr[sizeArr - 1]:
                    break;
    }
}
...