可以在switch语句中使用任意大小的constexpr数组吗?

问题描述 投票:0回答:3

是否可以在switch语句中使用大小可变的constexpr数组,以使每个arr [i]都是一种情况?还是if语句是唯一的解决方案。

constexpr int arr[] = {35, 2, 234, 42, ..., N}; // <------ Random ints
constexpr int size = sizeof(arr); // <----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

}

很抱歉,我正在寻找一种类似于'case range'的功能,某些编译器在为您创建case语句时提供了该功能。我知道编译器会在编译时知道大小。在我的应用程序中,此大小将经常更改。我已经在上面编辑了我的代码,以更好地反映我要去的逻辑。

c++ switch-statement constexpr
3个回答
0
投票

标准设置为最新的最新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;
    }
}

0
投票

是,但是必须正确计算数组的大小例如。 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
投票

没有指定大小的数组与具有指定大小的数组没有什么不同。编译器只是从初始化列表中获取大小,而不是在此处明确地写入它。因此,与具有指定大小的数组相比,在constexpr上下文中如何使用这种数组没有什么特别的。]

但是,没有机制可以自动构建对某个数组中的每个条目使用switch标签的case语句。您当然可以手动编写它们,但不能让编译器为您完成。

© www.soinside.com 2019 - 2024. All rights reserved.