Подтвердить что ты не робот

Передача любой функции в качестве параметра шаблона

Я хочу передать функцию значение в качестве параметра шаблона функции. В настоящее время лучше всего мне удалось:

template< typename F, F f >
void pass()
{
    ...
}

... который используется:

pass< decltype(&func), &func >();

Мне бы очень хотелось:

pass< &func >();

Есть ли способ достичь этого без макросов? В принципе, одновременно передавать и тип, и значение? У компилятора, очевидно, есть вся необходимая информация для этого...

Решение должно работать с переменными параметрами и типами возврата. Значение функции используется во время компиляции, поэтому оно не может быть передано в качестве аргумента.

Решения на С++ 11 приветствуются.


Изменить: использовать случай - я генерирую привязки во время компиляции, где мне нужно создать функцию С++ для каждой переданной функции. Пример использования этого кода выглядит (упрощен) более или менее следующим образом:

template < typename F, F f > 
int function_wrapper( lua_State* L ) 
{
    return dispatcher<typename return_type<F>::type>::call( L, 1, f );
}

void register_native_function( lua_Function f, const char* name )
{
    // binding call using pure C function f
}

template < typename F, F f >
void register_function( const char* name )
{
    register_native_function( function_wrapper< F, f >, name );
}

Обратите внимание, что мне нужно создать оболочку функции времени компиляции, поэтому мне нужно значение функции pass во время компиляции. Имеются обязательные решения, которые позволяют привязывать во время выполнения, но они всегда требуют кода шаблона по сравнению с рукописными привязками. Я собираюсь выполнить ручную работу здесь.

4b9b3361

Ответ 1

Я считаю, что сокращение в настоящее время невозможно. Год назад комитет С++ рассмотрел http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3601.html, чтобы исправить это, и они рекомендовали авторам продолжить его после того, как С++ 14 был освобожден.

Ответ 2

Вам нужно сделать typedef для любого типа функции, который вы хотите передать как указатель, например:

typedef int (*MyFunctionType)(int);

template <typename FunctionTypedef, typename ReturnType, typename ParameterType>
ReturnType callFunction(FunctionTypedef functionPointer, ParameterType i)
{
  static MyFunctionType myFunctionPointer = functionPointer;
  return (*functionPointer)(i);
}
int myFunction(int i)
{
}


int main()
{
  int i = 7;
  MyFunctionType myFunctionPointer = myFunction;
  return callFunction<MyFunctionType, int, int>(myFunctionPointer, i);
}

Изменить: если вы хотите сохранить эти произвольно введенные указатели на функции, тогда создайте базовый класс с функцией виртуальной "функции вызова" и шаблонным производным классом, который реализует эту функцию.