Я пытаюсь указать функцию, которая принимает обобщенную функцию в качестве параметра.Функция определяется следующим образом:
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;
}
Примерно так:
Fun<bool, int, double> func = wrap<bool, int, double, foo>;
Однако, к сожалению, это не компилируется.gcc 8.1 имеет следующее сообщение об ошибке:
<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>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
, а clang 6 имеет следующую ошибку:
<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>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Однако, если я заменим TsArgs
на int, double
, так же, какв сигнатуре foo()
он компилируется просто отлично, позволяя мне поверить, что эти аргументы шаблона переменной в середине списка параметров не работают, как я ожидал.Как я мог достичь своей цели иначе?
Вот 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;
}