powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / switch по элементам const int array
15 сообщений из 15, страница 1 из 1
switch по элементам const int array
    #38401531
rotvA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Под скажите, можно ли обустроить?
Хочется быстроты switch и удобства хранения данных array. Или аналоги.
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38401612
rotvA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже пожалуй struct с константами удобнее будет. Можно ли?
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38401756
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rotvA,

С массивом - нельзя, т.к. массивы не могут быть в составе константного выражения, которое требуется для case.
Cтруктуру можно, но только при использовании статических членов констант или перечислений:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
struct c
{
    static const int one = 1;
    enum {two = 2};
};


int main()
{
    switch (1) {
    case c::one:
        break;
    case c::two:
        break;
    }
    return 0;
}
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38401825
Anatoly MoskovskyrotvA,
С массивом - нельзя, т.к. массивы не могут быть в составе константного выражения, которое требуется для case.

В C++11 массивы могут быть constexpr.

GCC 4.8.2 держит, MSVS 2012 нет.

http://ideone.com/5Brcje
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#include <iostream>
using namespace std;

struct c
{
    static const int one = 1;
    enum {two = 2};
};

constexpr int array[] = {0, 1, 2, 3, 4, 5};

int main()
{
    switch (1) {
    case c::one:
        break;
    case c::two:
        break;
    case array[3]:
        break;
    case array[4]:
        break;  
    case sizeof(array):
        break;  
    }
    return 0;
}
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38404529
rotvA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, работает!!!
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38406963
rotvA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А кто знает как в структуру для заранее известного члена задать константу?
Я делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct blahblah
{
static const int key;
int variable1;
int variable2;
} alpha, beta, gamma;

int main ()
{
alpha.key=123;
}


Получаю "you cannot assign to a variable that is const"
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38407002
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rotvA,

Делай это в конструкторе.
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38407023
Anatoly MoskovskyrotvA,

Код: plaintext
1.
2.
3.
4.
5.
struct c
{
    static const int one = 1;
    enum {two = 2};
};
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38407037
rotvA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понимаю как.
То, что "как бы было уже", обозначает константу в явном виде. А мне надо для alpha, beta etc прописать. Чтобы именно к ним относилось. Причём константа для каждого члена разная.
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38407450
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
rotvAНе понимаю как.
То, что "как бы было уже", обозначает константу в явном виде. А мне надо для alpha, beta etc прописать. Чтобы именно к ним относилось. Причём константа для каждого члена разная.Если static, то для всех одинаковая. Если для каждого разная, тогда не надо static.
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38407657
rotvA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно на примере с кодом?
Скажем структура как я описал выше, присваиваем alpha.key константное значение 123, beta.key значение 456.
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38407693
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rotvA,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
struct S
{
    constexpr S(int v)
        : value(v)
    {}
    int value;
};

constexpr S s1(1), s2(2);

int main()
{

    switch (1) {
    case s1.value:
        break;
    case s2.value:
        break;
    }

    return 0;
}
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38408325
rotvA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению у меня бесплатная VSE 2010.Можно ли без constexpr обойтись?
PS мигрировать тяжело, на 3х компах стоит, везде одинаковый нужен.
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38408370
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rotvA,

Без constexpr поля структуры или элементы массива нельзя использовать в case.
...
Рейтинг: 0 / 0
switch по элементам const int array
    #38408417
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
template<int v>
struct S {
	static const int value = v;
};

typedef S<1> S1;
typedef S<2> S2;

int main() {

    switch (1) {
    case S1::value:
        break;
    case S2::value:
        break;
    }

    return 0;
}


Без constexpr тогда так
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / switch по элементам const int array
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]