Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
enum crap
{
shit = 0,
fuck,
dick,
ass,
turd,
fart,
};
static char *crap_to_str(int crap)
{
switch (crap)
{
case shit:
{
return "shit";
}
case fuck:
{
return "fuck";
}
case dick:
{
return "dick";
}
case ass:
{
return "ass";
}
case turd:
{
return "turd";
}
case fart:
{
return "fart";
}
default:
{
return "!!!UNKNOWN CRAP!!!";
}
}
}
Есть ли возможность через какую-нибудь плюсовую метушню с шаблонами, констэспрами и препроцессором нагенерировать подобную хрень из готового определения структуры?
https://stackoverflow.com/questions/240353/ - для сишного препроцессора такая хрень есть, из которой через какую-то там препроцессорную жопу можно и структуры и функцию со switch нагенерить, но мы исходим из предположения, что у нас уже определены готовые структуры, и переделывать это в понос из сишного препроцессора мы не хотим
Если я правильно понял автора, он хочет выводить коды произвольного enum'a.
Если я правильно понял тебя, то toString() придется определять для всех enum'ов.
Идея такая:
1. Есть заголовочный файл с енумами.
2. Инклюдишь его в какой-нибудь файл.
3. Компилируешь этот файл с отладочной информацией.
4. Пропускаешь объектный файл через постпроцессор, который вытаскивает отладочные записи для енумов, и генерирует из них функцию или базу данных, переводящую числа в наименования значений.
5. ?????
6. Выгода.
Насколько я знаю, из готового определения структуры — только какой-нибудь еблей с парсингом определений и генерацией исходников прямо во время конпелирования. Интроспекцию-то не завезли.
Надо их еще суметь сгенерировать из обычных готовых сишных энумов, а это ни в плюсах ни в сишке никак не сделать по-нормальному. Только писать код который читает и парсит код с этими самыми структурами и генерирует функции на основе него. И это при всем том количестве всевозможной хуйни, которую в последнем крестопарашном стандарте добавили стандартизаторы.
В нормальных языках есть абстрактные инструменты(term rewriting system), которыми ты можешь построить любые типы данных. Всё остальное — «поебень на постном масле».
Abstract reduction system, (abbreviated ARS) is the most general (unidimensional) notion about specifying a set of objects and rules that can be applied to transform them.
Пытался реализовать самостоятельно, не применяя вызов WriteStr. Оказывается, RTTI сохраняется только для свойств классов, для скалярных переменных RTTI не записывается. Поэтому для получения массива названий енумов нужно оборачивать свойство в класс:
{$mode objfpc}
{$M+}
uses typinfo;
type
TRoosters = (GoldenRooster, Junglefowl, FightingCock, Fjalarr, Gullinkambi, GallicRooster, You);
TTestPituh = class(TObject)
private
TestField: TRoosters;
published
property TestProp: TRoosters read TestField write TestField;
end;
function GetRoosterName(x: TRoosters): string;
Var
O : TTestPituh;
begin
O := TTestPituh.Create;
GetRoosterName := GetEnumName(GetPropInfo(O,'TestProp')^.PropType, Ord(x));
O.Destroy
end;
begin
Writeln(GetRoosterName(FightingCock))
end.
{$mode objfpc}
{$modeswitch typehelpers}
type
TRoosters = (GoldenRooster, Junglefowl, FightingCock, Fjalarr, Gullinkambi, GallicRooster, You);
TRoostersHelper = type helper for TRoosters
public
function toString: string;
end;
function TRoostersHelper.toString: string;
begin
WriteStr(Result, self)
end;
begin
Writeln(FightingCock.toString)
end.
* g o a t s e x * g o a t s e x * g o a t s e x *
g g
o / \ \ / \ o
a| | \ | | a
t| `. | | : t
s` | | \| | s
e \ | / / \\\ --__ \\ : e
x \ \/ _--~~ ~--__| \ | x
* \ \_-~ ~-_\ | *
g \_ \ _.--------.______\| | g
o \ \______// _ ___ _ (_(__> \ | o
a \ . C ___) ______ (_(____> | / a
t /\ | C ____)/ \ (_____> |_/ t
s / /\| C_____) | (___> / \ s
e | ( _C_____)\______/ // _/ / \ e
x | \ |__ \\_________// (__/ | x
* | \ \____) `---- --' | *
g | \_ ___\ /_ _/ | g
o | / | | \ | o
a | | / \ \ | a
t | / / | | \ |t
s | / / \__/\___/ | |s
e | / / | | | |e
x | | | | | |x
* g o a t s e x * g o a t s e x * g o a t s e x *
https://ideone.com/I5vW1M
Если я правильно понял тебя, то toString() придется определять для всех enum'ов.
https://sourceware.org/gdb/current/onlinedocs/stabs.html#Enumerations
http://git.dwarfstd.org/?p=dwarf-doc.git;a=blob;f=dwarf5/latexdoc/typeentries.tex;hb=HEAD#l1594
1. Есть заголовочный файл с енумами.
2. Инклюдишь его в какой-нибудь файл.
3. Компилируешь этот файл с отладочной информацией.
4. Пропускаешь объектный файл через постпроцессор, который вытаскивает отладочные записи для енумов, и генерирует из них функцию или базу данных, переводящую числа в наименования значений.
5. ?????
6. Выгода.
Как с такими поступать?
Это такие енумы у которых сосут все остальные енумы
Abstract reduction system, (abbreviated ARS) is the most general (unidimensional) notion about specifying a set of objects and rules that can be applied to transform them.
Доречи еще всякие тулы из схем wsdl генерят прокси классы
Желательно описывать всё в Axiom, чтобы гомоиконы и котогенерация.
обычно берут кодоргенерацию.
Не, лучше в Metamath http://us.metamath.org/mpeuni/mmset.html
Чтоб https://en.wikipedia.org/wiki/Rewriting
https://wandbox.org/permlink/QGryioh963FK4n3c
О даааа, считать буковки, как настоящие вконтактовские олимпиадные программисты https://govnokod.ru/24447
Пописал на плюсах - как говна поел. https://wandbox.org/permlink/WnrOCbjzOqYmsyxm
☑ Неймс-пейсы.
☑ Слово «class».
☑ Перегруженные опера-торы.
☑ Констэкспры.
☑ Крестошоблоны.
☑ Крестокасты.
☑ Вывод типов.
И всё-таки остаётся ощущение, что чего-то не хватает. Может быть, онанимных замыканий?
https://ideone.com/wH1KrY
Именно поэтому я за Фрипаскаль.
https://ideone.com/FJa8z4
https://ideone.com/irFUNw
https://ideone.com/5Gb8L6
AsString же.