Искажение имен для шаблонных функций во время выполнения-возможно?


Предположим, что я написал функцию foo<T> (у меня есть полная сигнатура с пространствами имен), но сейчас это неважно); и предположим, что нет никакой другой функции, перегружающей ее (в соответствующем пространстве имен она находится). Теперь давайте поместим себя во время выполнения. Предположим, у меня есть строка "foo", и для некоторого типа MyType у меня есть typeid(MyType) (из заголовка <memory>).

Могу ли я каким-то образом получить символ имя для foo<MyType>?

Вторая версия этого вопроса: теперь предположим, что у меня есть полный подпись foo в виде строки, а не только имя; и отбросьте предположение об отсутствии перегрузок.

Примечания:

    Нет, я спрашиваю не о самом символе, а только о названии. Это был бы интересный вопрос для другого раза.
  • ответы, которые зависят от foo<T>, поступающих из общей библиотеки, релевантны, хотя я не думаю, что это должно иметь значение только для символаимя .
  • меня здесь не волнует производительность, я сделаю все, что угодно. принимает. Помоги мне Оби Ван, ты моя последняя надежда и т.д. Итак, RTTI, компиляция со странными флагами, что угодно.
  • платформенно-зависимые ответы также актуальны: GNU / Linux с версией ядра >= 3.x, процессор x86_64, gcc >= 4.8 .
1 4

1 ответ:

Нет, не можешь.

Чтобы получить искаженное имя экземпляра шаблона функции, вам потребуется в простейшем случае следующая информация:

  • полное имя функции (вы сказали, что у вас есть только "foo", Что делать, если функция находится в пространстве имен?)
  • типы всех аргументов типа шаблона (искаженное имя типа может быть достаточно, если схема искажения имени функции непосредственно включает имя типа; в противном случае вам понадобится полный тип имя, потенциально рекурсивно во все аргументы шаблона типа).
  • типы всех аргументов функции (применяется та же оговорка).

Предполагается, что у вас нет параметров шаблона шаблона или параметров, не относящихся к типу. Это становится намного сложнее, когда у вас есть те, так как это может потребовать искаженных форм целых деревьев выражения. Он также предполагает, что вы не имеете дело с частичной или полной явной специализацией, что еще сложнее. И это так наконец, предположим, что ваша функция не имеет специального оформления из-за специфичных для компилятора расширений (например, __stdcall в 32-разрядных средах Windows). О, и некоторые ABI могут также кодировать возвращаемый тип функции.

Поскольку в соответствии с вашей предпосылкой у вас есть только имя функции (не ясно, является ли оно полным) и объекты type_id аргументов шаблона (которые могут работать как источник искаженного имени типа, но не на всех платформах), у вас есть недостаточно информации, чтобы воссоздать искаженное имя.

Это оставляет возможность получения списка всех скомпилированных символов из вашего двоичного файла (если таковой имеется) и поиска наиболее вероятного кандидата, который, конечно, подвержен ошибкам.