J'essaie de spécifier une fonction qui prend une fonction générique comme paramètre. La fonction est définie comme suit :
template <typename TRet, typename... TsArgs>
using Fun = TRet (*)(TsArgs...);
Comment spécifier une fonction générique qui prend cette fonction générique comme paramètre ? J'ai essayé ceci :
template<typename TRet, typename... TsArgs, Fun<TRet, TsArgs...> F>
TRet wrap(TsArgs... args) {
return F(args...);
}
Pour envelopper cette fonction :
bool foo(int x, double y) {
return x < y;
}
Comme ça :
Fun<bool, int, double> func = wrap<bool, int, double, foo>;
Cependant, cela ne compile malheureusement pas. gcc 8.1 a le message d'erreur suivant :
<source>:16:35: error: no matches converting function 'wrap' to type 'Fun<bool, int, double>' {aka 'bool (*)(int, double)'}
Fun<bool, int, double> func = wrap<bool, int, double, foo>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
et clang 6 a l'erreur suivante :
<source>:16:35: error: address of overloaded function 'wrap' does not match required type 'bool (int, double)'
Fun<bool, int, double> func = wrap<bool, int, double, foo>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cependant, si je remplace le TsArgs
con int, double
comme dans la signature de foo()
il se compile très bien, ce qui me laisse penser que les arguments variadiques des modèles au milieu de la liste des paramètres ne fonctionnent pas comme prévu. Comment pourrais-je atteindre mon objectif autrement ?
Voici le MCVE :
template <typename TRet, typename... TsArgs>
using Fun = TRet (*)(TsArgs...);
template<typename TRet, typename... TsArgs, Fun<TRet, TsArgs...> F>
TRet wrap(TsArgs... args) {
return F(args...);
}
bool foo(int x, double y) {
return x < y;
}
int main() {
Fun<bool, int, double> func = wrap<bool, int, double, foo>;
return 0;
}