Простецкий вопрос
От: TailWind  
Дата: 26.10.20 02:26
Оценка:
Вот есть константы
Каждая на 1 больше другой

Как это автоматизировать?
Не хочется ошибиться вбивая номера
Хочется написать что-то типа = N++;

static const ULONG Cmd_aaa = 1;
static const ULONG Cmd_bbb = 2;
static const ULONG Cmd_ccc = 3;
static const ULONG Cmd_ddd = 4;
Re: Простецкий вопрос
От: LaptevVV Россия  
Дата: 26.10.20 02:58
Оценка:
TW>Вот есть константы
TW>Каждая на 1 больше другой

TW>Как это автоматизировать?

TW>Не хочется ошибиться вбивая номера
TW>Хочется написать что-то типа = N++;
enum class с перегрузкой операции ++
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Простецкий вопрос
От: bnk СССР http://unmanagedvisio.com/
Дата: 26.10.20 03:16
Оценка: 5 (2) +2
Здравствуйте, LaptevVV, Вы писали:

TW>>Вот есть константы

TW>>Каждая на 1 больше другой

TW>>Как это автоматизировать?

TW>>Не хочется ошибиться вбивая номера
TW>>Хочется написать что-то типа = N++;
LVV>enum class с перегрузкой операции ++

А почему не просто enum

enum : ULONG {
  Cmd_aaa = 1,
  Cmd_bbb,
  Cmd_ccc,
  Cmd_ddd
};
Re[3]: Простецкий вопрос
От: LaptevVV Россия  
Дата: 26.10.20 04:30
Оценка:
LVV>>enum class с перегрузкой операции ++
bnk>А почему не просто enum
bnk>
bnk>enum : ULONG {
bnk>  Cmd_aaa = 1,
bnk>  Cmd_bbb,
bnk>  Cmd_ccc,
bnk>  Cmd_ddd
bnk>};
bnk>

Можно и так. Но тут неявно происходит преобразование типа.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Простецкий вопрос
От: Muxa  
Дата: 26.10.20 10:48
Оценка: 12 (3) :)
const ULONG Cmd_init = __LINE__;
const ULONG Cmd_aaa = __LINE__ - Cmd_init;
const ULONG Cmd_bbb = __LINE__ - Cmd_init;
const ULONG Cmd_ccc = __LINE__ - Cmd_init;
const ULONG Cmd_ddd = __LINE__ - Cmd_init;
Re: Простецкий вопрос
От: vopl Россия  
Дата: 26.10.20 10:57
Оценка: 13 (2) -1
Здравствуйте, TailWind, Вы писали:

TW>Вот есть константы

TW>Каждая на 1 больше другой

TW>Как это автоматизировать?

TW>Не хочется ошибиться вбивая номера
TW>Хочется написать что-то типа = N++;

TW>
TW>static const ULONG Cmd_aaa = 1;
TW>static const ULONG Cmd_bbb = 2;
TW>static const ULONG Cmd_ccc = 3;
TW>static const ULONG Cmd_ddd = 4;
TW>


#include <iostream>

template <int I> struct Cnt {static constexpr int v = Cnt<I-1>::v;};
template <> struct Cnt<0> {static constexpr int v = 0;};

#define NEXT(name) template <> struct Cnt<__LINE__> {static constexpr int v = Cnt<__LINE__-1>::v+1;}; static const int name = Cnt<__LINE__>::v;

NEXT(Cmd_aaa);
NEXT(Cmd_bbb);

NEXT(Cmd_ccc);
NEXT(Cmd_ddd);

int main()
{
    std::cout << Cmd_aaa << ", " << Cmd_bbb << ", " << Cmd_ccc << ", " << Cmd_ddd << std::endl;
    return 0;
}


добавка: со структурой переборщил, можно сразу значениями оперировать
template <int I> constexpr int Cnt = Cnt<I-1>;
template <> constexpr int Cnt<0> = 0;

#define NEXT(name) template <> constexpr int Cnt<__LINE__> = Cnt<__LINE__-1>+1; static const int name = Cnt<__LINE__>;
Отредактировано 26.10.2020 11:08 vopl . Предыдущая версия .
Re: Простецкий вопрос
От: SaZ  
Дата: 26.10.20 11:32
Оценка: -1
Здравствуйте, TailWind, Вы писали:

TW>Вот есть константы

TW>Каждая на 1 больше другой

TW>Как это автоматизировать?

TW>Не хочется ошибиться вбивая номера
TW>Хочется написать что-то типа = N++;

TW>
TW>static const ULONG Cmd_aaa = 1;
TW>static const ULONG Cmd_bbb = 2;
TW>static const ULONG Cmd_ccc = 3;
TW>static const ULONG Cmd_ddd = 4;
TW>


https://rsdn.org/forum/cpp/6739616
Автор: rg45
Дата: 29.03.17
Re: Простецкий вопрос
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.10.20 11:43
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>
TW>static const ULONG Cmd_aaa = 1;
TW>static const ULONG Cmd_bbb = 2;
TW>static const ULONG Cmd_ccc = 3;
TW>static const ULONG Cmd_ddd = 4;
TW>


На Go это пишется так:

const (
       Cmd_aaa = iota + 1
       Cmd_bbb
       Cmd_ccc
       Cmd_ddd 
)


И там может быть любое выражение с этой самой йотой. Смысл в том, что оно (выражение) автоматически приписывается к каждой следующей константе, а сама iota увеличивается каждый раз на 1.

Неужели в новомодном C++ ничего подобного до сих пор не изобрели?
Re[4]: Простецкий вопрос
От: TailWind  
Дата: 28.10.20 22:21
Оценка:
Класс, спасибо!

LVV>Можно и так. Но тут неявно происходит преобразование типа.


Объясните, пожалуйста, почему
Отредактировано 28.10.2020 22:23 TailWind . Предыдущая версия . Еще …
Отредактировано 28.10.2020 22:22 TailWind . Предыдущая версия .
Re[5]: Простецкий вопрос
От: B0FEE664  
Дата: 29.10.20 08:48
Оценка: +1
Здравствуйте, TailWind, Вы писали:

LVV>>Можно и так. Но тут неявно происходит преобразование типа.

TW>Объясните, пожалуйста, почему

Каждый enum — это отдельный тип.
И каждый день — без права на ошибку...
Re: Простецкий вопрос
От: ути-пути Россия  
Дата: 02.11.20 06:23
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Вот есть константы

TW>Каждая на 1 больше другой

TW>Как это автоматизировать?

TW>Не хочется ошибиться вбивая номера
TW>Хочется написать что-то типа = N++;

https://rsdn.org/forum/cpp/2337981.1
Автор: remark
Дата: 07.02.07
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Простецкий вопрос
От: Voivoid Россия  
Дата: 02.11.20 08:45
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Вот есть константы

TW>Каждая на 1 больше другой

TW>Как это автоматизировать?



Boost preprocessor к нам приходит!

#include <iostream>

#include "boost/preprocessor.hpp"

#define DECLARE_CONSTANT(z, n, seq) static const unsigned long BOOST_PP_SEQ_ELEM(n, seq) = n;
#define DECLARE_CMD_CONSTANTS( SEQ ) BOOST_PP_REPEAT( BOOST_PP_SEQ_SIZE( SEQ ), DECLARE_CONSTANT, SEQ )


#define CMD_SEQ (Cmd_aaa)(Cmd_bbb)(Cmd_ccc)(Cmd_ddd)

DECLARE_CMD_CONSTANTS( CMD_SEQ )

int main() {
  // test:
  std::cout << Cmd_aaa << Cmd_bbb << Cmd_ccc << Cmd_ddd << std::endl;
  return 0;
}



рабочий пример: https://wandbox.org/permlink/AWPpIePEtzaclqdb
Re[2]: Простецкий вопрос
От: sts  
Дата: 03.11.20 22:46
Оценка:
Здравствуйте, vopl, Вы писали:

V>Здравствуйте, TailWind, Вы писали:


TW>>Вот есть константы

TW>>Каждая на 1 больше другой

TW>>Как это автоматизировать?

TW>>Не хочется ошибиться вбивая номера
TW>>Хочется написать что-то типа = N++;

TW>>
TW>>static const ULONG Cmd_aaa = 1;
TW>>static const ULONG Cmd_bbb = 2;
TW>>static const ULONG Cmd_ccc = 3;
TW>>static const ULONG Cmd_ddd = 4;
TW>>


V>
V>#include <iostream>

V>template <int I> struct Cnt {static constexpr int v = Cnt<I-1>::v;};
V>template <> struct Cnt<0> {static constexpr int v = 0;};

V>#define NEXT(name) template <> struct Cnt<__LINE__> {static constexpr int v = Cnt<__LINE__-1>::v+1;}; static const int name = Cnt<__LINE__>::v;

V>NEXT(Cmd_aaa);
V>NEXT(Cmd_bbb);

V>NEXT(Cmd_ccc);
V>NEXT(Cmd_ddd);

V>int main()
V>{
V>    std::cout << Cmd_aaa << ", " << Cmd_bbb << ", " << Cmd_ccc << ", " << Cmd_ddd << std::endl;
V>    return 0;
V>}
V>


V>добавка: со структурой переборщил, можно сразу значениями оперировать

V>
V>template <int I> constexpr int Cnt = Cnt<I-1>;
V>template <> constexpr int Cnt<0> = 0;

V>#define NEXT(name) template <> constexpr int Cnt<__LINE__> = Cnt<__LINE__-1>+1; static const int name = Cnt<__LINE__>;
V>


какой-то пиздос оверинжиниринг
Re[2]: Простецкий вопрос
От: sts  
Дата: 03.11.20 22:47
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, TailWind, Вы писали:


TW>>
TW>>static const ULONG Cmd_aaa = 1;
TW>>static const ULONG Cmd_bbb = 2;
TW>>static const ULONG Cmd_ccc = 3;
TW>>static const ULONG Cmd_ddd = 4;
TW>>


Pzz>На Go это пишется так:


Pzz>
Pzz>const (
Pzz>       Cmd_aaa = iota + 1
Pzz>       Cmd_bbb
Pzz>       Cmd_ccc
Pzz>       Cmd_ddd 
Pzz>)
Pzz>


Pzz>И там может быть любое выражение с этой самой йотой. Смысл в том, что оно (выражение) автоматически приписывается к каждой следующей константе, а сама iota увеличивается каждый раз на 1.


Pzz>Неужели в новомодном C++ ничего подобного до сих пор не изобрели?


go home
Re[3]: Простецкий вопрос
От: sts  
Дата: 03.11.20 22:48
Оценка: +1
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, LaptevVV, Вы писали:


TW>>>Вот есть константы

TW>>>Каждая на 1 больше другой

TW>>>Как это автоматизировать?

TW>>>Не хочется ошибиться вбивая номера
TW>>>Хочется написать что-то типа = N++;
LVV>>enum class с перегрузкой операции ++

bnk>А почему не просто enum


bnk>
bnk>enum : ULONG {
bnk>  Cmd_aaa = 1,
bnk>  Cmd_bbb,
bnk>  Cmd_ccc,
bnk>  Cmd_ddd
bnk>};
bnk>


единственный адекватный ответ
что у людей в гллове — ппц
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.