ОБНОВЛЕНИЕ: После некоторого дополнительного чтения я действительно хотел получить раннее связывание (которое должно быть переведено в немедленный вызов для не виртуальных функций и кода не-PIC), что можно сделать, передав функция (член) в качестве параметра шаблона. Проблема, с которой я столкнулся, заключалась в том, что gcc <4.5 и icc 11.1 могут генерировать несколько прикольных инструкций для вызовов параметров шаблона указателя на функцию-член. AFAICT, gcc> = 4,5 и vs2008 отлично справляются с этими вызовами параметров шаблона.
Прежде всего, может быть, литералы не являются подходящим термином для этой концепции, но это наиболее близкий мне вариант (не литералы в смысле функций как граждан первого класса).
Идея состоит в том, что когда вы делаете обычный вызов функции, он компилируется во что-то вроде этого:
callq <immediate address>
Но если вы делаете вызов функции, используя указатель на функцию, он компилируется примерно так:
mov <memory location>,%rax
callq *%rax
Что все хорошо. Однако что, если я пишу библиотеку шаблонов, которая требует какого-то обратного вызова с указанным списком аргументов, и пользователь библиотеки должен знать, какую функцию он хочет вызвать во время время компиляции ? Затем я хотел бы написать свой шаблон, чтобы принимать литерал функции в качестве параметра шаблона. Итак, аналогично
template <int int_literal>
struct my_template {...};`
Я бы хотел написать
template <func_literal_t func_literal>
struct my_template {...};
и вызовы func_literal в компиляции my_template для callq <immediate address>
.
Есть ли в C ++ средство для этого или обходной путь для достижения того же эффекта? Если нет, то почему (например, некоторые катастрофические побочные эффекты)? Как насчет C ++ 0x или другого языка?