170 похожих чатов

Привет! Можно ли сделать define, который умеет в переменное число аргументов? Хочу,

чтобы строчка DECLARE(A, B, C) раскрывалась в следующее:
enum class Types: std::size_t { A, B, C };
const map<Types, std::string> mapa = {{Types::A, "A"}, {Types::B, "B"}, {Types::C, "C"}};
Но при этом число аргументов должно быть нефиксированным, то есть их может быть 3, может быть любое другое положительное число.
Гуглеж по инету сказал, что такое невозможно (ни через variadic, ни через __COUNTER__'ы), но вдруг за последние несколько лет что-то поменялось.

15 ответов

13 просмотров

#define DECLARE(...) enum class Types { __VA_ARGS__ };

Boost.PP такое умеет https://www.boost.org/doc/libs/1_74_0/libs/preprocessor/doc/index.html Но от этой технологии можно кукушкой поехать - отладка там крайне неприятная

Danya🔥
#define DECLARE(...) enum class Types { __VA_ARGS_...

А ну только там не будет разделения с запятой, сори

Посмотри как работают https://github.com/quicknir/wise_enum https://github.com/aantron/better-enums а можно просто их поюзать

Vlad
для этого добавили __VA_OPT__

Для того, чтобы не было разделения запятой?

https://godbolt.org/z/f8zjzK

Danya🔥
Для того, чтобы не было разделения запятой?

я неправильно понял, прошу прощения это чтобы не городить страшные конструкции для обработки края __VA_ARGS__, конечно

Ruzal-Ibragimov Автор вопроса
Vlad
https://godbolt.org/z/f8zjzK

Тут же надо Fки заводить руками)

Ruzal Ibragimov
Тут же надо Fки заводить руками)

заведите разок сколько надо, и пользуйтесь на здоровье как я понимаю, макросы рекурсивно не раскрываются, к сожалению или к счастью

Ruzal-Ibragimov Автор вопроса
Vlad
заведите разок сколько надо, и пользуйтесь на здор...

В общем-то спасибо, но хотелось бы для любого числа аргументов решать задачу)

Вам точно не будет достаточно библиотеки magic_enum для своей задачи?

Похожие вопросы

Обсуждают сегодня

Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
А чем вам питонисты не угодили?😂
.
79
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
Всем привет. Поделитесь, пожалуйста, опытом. Есть форма, на которой имеется dbgrid и кнопки: добавить, редактировать, удалить. Если нет записей в dbgrid, то кнопки редактирова...
Евгений
5
type TExtensions<GExtender>=class function GetExtension<GEntityExtenderType>:GEntityExtenderType; end; function TExtensions<GExtender>.GetExtension<GEntityExtenderType...
zamtmn
8
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Всем привет, препод задал вопрос, подскажите пожалуйста, какой адрес инкапсулирует указатель?
Свинка Пеппа
8
Почему никто ещё не написал квантовую виртуальную машину на Windows?
КТ315
7
Вот смотрите у меня есть два стрима сейчас fs, cs: TStream; fs := TFileStream.Create('filename'); cs := TCompressionStream.Create(compression_level, fs); Я хочу сделать так: ...
notme
5
Карта сайта