传递任何函数作为模板参数

Kor*_*icz 34 c++ templates function-pointers c++11

我想将函数作为模板参数传递给函数.目前我设法做的最好的是:

template< typename F, F f >
void pass()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

...使用的:

pass< decltype(&func), &func >();
Run Code Online (Sandbox Code Playgroud)

我真正想要的是:

pass< &func >();
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有宏的情况下实现这个目标?基本上同时传递类型和值?编译器显然拥有所需的所有信息......

解决方案必须使用变量参数和返回类型.函数值在编译时使用,因此不能作为参数传递.

欢迎使用C++ 11解决方案.


编辑:用例 - 我在编译时生成绑定,我需要为每个传递的函数创建一个C++函数.这段代码的用例看起来(简化)或多或少像这样:

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 );
}
Run Code Online (Sandbox Code Playgroud)

请注意,我需要创建一个编译时函数包装器,所以我需要在编译时传递函数值.有一些绑定解决方案允许在运行时绑定,但与手写绑定相比,它们总是需要样板代码.我的目标是在这里实现手写性能.

Jef*_*kin 17

我相信缩短这个目前是不可能的.一年前,C++委员会查看了http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3601.html来解决这个问题,他们鼓励作者继续追求它. C++ 14发布了.

  • FWIW,我一直在争论使用更紧凑的符号`template <auto X>`(用`decltype`检索类型部分).我相信现在已经具有牵引力,因此该论文的修订将有希望表明这一点. (4认同)

LB-*_*B-- 9

现在可以在C++ 17中使用template<auto>:

template<auto Func>
struct FuncWrapper final
{
    template<typename... Args>
    auto operator()(Args &&... args) const
    {
        return Func(std::forward<Args>(args)...);
    }
};

int add(int a, int b)
{
    return a + b;
}

int main()
{
    FuncWrapper<add> wrapper;
    return wrapper(12, 34);
}
Run Code Online (Sandbox Code Playgroud)

演示:https://godbolt.org/g/B7W56t

您可以使用#ifdef __cpp_nontype_template_parameter_auto在代码中检测编译器对此的支持.