Страницы

Поиск по вопросам

понедельник, 15 апреля 2019 г.

Определить сигнатуру функции

Как в C++ определить сигнатуру функции, переданной в шаблон другой функции? Делаю так:
#include
template struct Signature;
template struct Signature { using RetType = R;
using Arguments = std::tuple; };
template void test(Func f) { using Sig = Signature; Sig s; //Error: Sig - undefined struct }
double square(double x) { return x * x; }
int main() { using Sig = Signature; Sig s; //ok test(square); }
Вот что меня смутило в логе компиляции:
error C2079: 's' uses undefined struct 'Signature' with [ Func=double (__cdecl *)(double) ]
Появилось (__cdecl *). Что оно вообще означает, и как тогда определить сигнатуру в test(Func f)?


Ответ

Надо добавить специализацию для указателя на функцию:
template struct Signature { using RetType = R;
using Arguments = std::tuple; };
Это нужно потому, что после передачи функции в качестве параметра в test она неявно преобразуется в указатель и тип Func будет на самом деле указателем на функцию.

Комментариев нет:

Отправить комментарий