Я сталкиваюсь с некоторыми странными явлениями, связанными с различными шаблонами, которые я никогда раньше не видел.
Для простоты я приведу простой пример того, чего я пытался достичь, реальный код немного сложнее.
Итак, у меня есть одна функция, которая выглядит следующим образом:
template <typename T, typename F, typename ... Args>
static T Func( std::string str, Args&& ... args )
{
... Do something
}
Затем я вызываю эту функцию несколько раз из разных мест, где в большинстве случаев передаваемые типы различны. Но когда я отлаживаю это, когда я ищу символ Func, я получаю, что один и тот же адрес функции имеет несколько разных символов:
00000000`70ba4ae0 Func<unsigned long,unsigned long (__stdcall*)(wchar_t const *),wchar_t const *>
00000000`70ba4ae0 Func<void *,void * (__stdcall*)(unsigned int),unsigned int>
00000000`70ba4ae0 Func<int,int (__stdcall*)(void *),void *>
Так что все они в основном одинаковые функции. Когда я пытаюсь позвонить, например:
call Func<void *,void * (__stdcall*)(unsigned int),unsigned int>
В отладчике вижу:
call Func<int,int (__stdcall*)(void *),void *>
Я вижу, что для каждого экземпляра функции шаблона существует сгенерированный символ, но каждый такой экземпляр, имеющий одинаковое количество аргументов и аргументы одинакового размера в байтах, просто связан с одной функцией.
Хотя я могу понять, почему это может произойти, но есть ли способ заставить каждую функцию быть автономной?