PDA

Просмотр полной версии : [Вопрос] tagof



oukibt
03.06.2021, 08:14
Есть ли аналог оператора tagof в с++?
(Речь идёт конкретно о получении тега переменной, созданной в павн (например, Float:), а не о получении типа переменной (char, int...))

Daniel_Cortez
03.06.2021, 10:17
(Речь идёт конкретно о получении тега переменной, созданной в павн (например, Float:), а не о получении типа переменной (char, int...))
Я правильно понимаю, нужно получить тип значения Pawn, переданного как аргумент нативной функции в плагине?

oukibt
03.06.2021, 10:18
Я правильно понимаю, нужно получить тип значения Pawn, переданного как аргумент нативной функции в плагине?

Именно

Daniel_Cortez
03.06.2021, 15:18
Для одиночного аргумента с несколькими возможными тегами
native Func({_,Float}:arg);
можно добавить дополнительный аргумент, в который по умолчанию будет передаваться ID тега:
native Func({_,Float}:arg, tagid=tagof(arg));
Затем на стороне плагина следует передать значение такого доп. аргумента (tagid) в функцию amx_GetTag(), и та вернёт название тега.
Почему нужно работать с названиями тегов, а не с числами? Потому что у каждого скомпилированного скрипта (*.amx) есть своя таблица тегов, в которой хранятся только те теги, которые используются в скрипте. Т.е. у каждого скрипта своё содержимое таблицы; нет универсальных ID тегов, которые подойдут для всех скриптов. Единственные исключения - тег "_" всегда имеет индекс 0, а "bool" - индекс 1. Остальные теги зависят от кода, в том числе от порядка подключения инклудов, в которых эти теги объявляются.

Естественно, для функций с вариативными аргументами, например:
native Func({_,bool,Float}:...);
провернуть вышеописанный трюк с tagof не выйдет. В таких случаях уже ничего не сделать.