Страницы

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

воскресенье, 9 февраля 2020 г.

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

#cpp #функции #шаблоны_с++


Как в 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)?
    


Ответы

Ответ 1



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

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

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