Я пишу обобщенную функцию-обертку, которая может обернуть любую функцию в вызов в стиле lua, который имеет вид
int lua_function (lua_State * L)
И я хочуфункция-обертка генерируется на лету, поэтому я подумываю передать функцию в качестве аргумента шаблона.Это тривиально, если вы знаете число (например, 2) аргументов:
template <typename R, typename Arg1, typename Arg2, R F(Arg1, Args)>
struct wrapper
Однако я не знаю число, поэтому я прошу переменный аргумент шаблона для справки
// This won't work
template <typename R, typename... Args, R F(Args...)>
struct wrapper
Вышеприведенное не скомпилируется, поскольку переменный аргумент должен быть последним.Поэтому я использую двухуровневый шаблон, внешний шаблон захватывает типы, внутренний шаблон захватывает функцию:
template <typename R, typename... Args>
struct func_type<R(Args...)>
{
// Inner function wrapper take the function pointer as a template argument
template <R F(Args...)>
struct func
{
static int call( lua_State *L )
{
// extract arguments from L
F(/*arguments*/);
return 1;
}
};
};
Это работает, за исключением того, что для обертывания функции типа
double sin(double d) {}
пользовательдолжен написать
func_type<decltype(sin)>::func<sin>::apply
, что утомительно.Вопрос: есть ли лучший, более удобный для пользователя способ сделать это?(Я не могу использовать шаблон функции, чтобы обернуть все это, потому что параметр функции не может использоваться в качестве аргумента шаблона.)