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