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发布了.
现在可以在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
在代码中检测编译器对此的支持.