Искажение имен для шаблонных функций во время выполнения-возможно?
Предположим, что я написал функцию foo<T>
(у меня есть полная сигнатура с пространствами имен), но сейчас это неважно); и предположим, что нет никакой другой функции, перегружающей ее (в соответствующем пространстве имен она находится). Теперь давайте поместим себя во время выполнения. Предположим, у меня есть строка "foo", и для некоторого типа MyType
у меня есть typeid(MyType)
(из заголовка <memory>
).
Могу ли я каким-то образом получить символ имя для foo<MyType>
?
Вторая версия этого вопроса: теперь предположим, что у меня есть полный подпись foo в виде строки, а не только имя; и отбросьте предположение об отсутствии перегрузок.
Примечания:
- Нет, я спрашиваю не о самом символе, а только о названии. Это был бы интересный вопрос для другого раза.
- ответы, которые зависят от
foo<T>
, поступающих из общей библиотеки, релевантны, хотя я не думаю, что это должно иметь значение только для символаимя . - меня здесь не волнует производительность, я сделаю все, что угодно. принимает. Помоги мне Оби Ван, ты моя последняя надежда и т.д. Итак, RTTI, компиляция со странными флагами, что угодно.
- платформенно-зависимые ответы также актуальны: GNU / Linux с версией ядра >= 3.x, процессор x86_64, gcc >= 4.8 .
1 ответ:
Нет, не можешь.
Чтобы получить искаженное имя экземпляра шаблона функции, вам потребуется в простейшем случае следующая информация:
- полное имя функции (вы сказали, что у вас есть только
"foo"
, Что делать, если функция находится в пространстве имен?)- типы всех аргументов типа шаблона (искаженное имя типа может быть достаточно, если схема искажения имени функции непосредственно включает имя типа; в противном случае вам понадобится полный тип имя, потенциально рекурсивно во все аргументы шаблона типа).
- типы всех аргументов функции (применяется та же оговорка).
Предполагается, что у вас нет параметров шаблона шаблона или параметров, не относящихся к типу. Это становится намного сложнее, когда у вас есть те, так как это может потребовать искаженных форм целых деревьев выражения. Он также предполагает, что вы не имеете дело с частичной или полной явной специализацией, что еще сложнее. И это так наконец, предположим, что ваша функция не имеет специального оформления из-за специфичных для компилятора расширений (например,
__stdcall
в 32-разрядных средах Windows). О, и некоторые ABI могут также кодировать возвращаемый тип функции.Поскольку в соответствии с вашей предпосылкой у вас есть только имя функции (не ясно, является ли оно полным) и объекты type_id аргументов шаблона (которые могут работать как источник искаженного имени типа, но не на всех платформах), у вас есть недостаточно информации, чтобы воссоздать искаженное имя.
Это оставляет возможность получения списка всех скомпилированных символов из вашего двоичного файла (если таковой имеется) и поиска наиболее вероятного кандидата, который, конечно, подвержен ошибкам.