【发布时间】:2014-08-02 19:58:34
【问题描述】:
我想将函数值作为模板参数传递给函数。目前我能做的最好的事情是:
template< typename F, F f >
void pass()
{
...
}
...使用的:
pass< decltype(&func), &func >();
我真正想要的是:
pass< &func >();
有没有什么方法可以在没有宏的情况下实现这一点?基本上同时传递类型和值?编译器显然拥有所需的所有信息......
解决方案必须使用可变参数和返回类型。函数值在编译时使用,因此不能作为参数传递。
欢迎使用 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 );
}
请注意,我需要创建一个编译时函数包装器,所以我需要在编译时传递函数值。有一些绑定解决方案允许在运行时进行绑定,但与手写绑定相比,它们总是需要样板代码。我的目标是在这里实现手写的性能。
【问题讨论】:
-
您是否衡量过
template<class F> pass (F fun)是否会给您带来任何开销?根本的问题是你不能传递除整数值以外的任何东西作为非类型模板参数。 -
传递函数不会(显然)产生任何开销,但是在绑定诸如
vec3d类(其方法可能被调用数千次)之类的东西时,使用泛型调用函数的需求非常明显在一帧中。 -
@TemplateRex "你不能传递除整数值以外的任何东西" --- 这不完全正确。
-
传递模板未知类型的非类型模板参数的唯一方法是将其类型作为类型模板参数传递,然后传递值。所以
decltype(&func), &func是你能得到的最好的。
标签: c++ templates c++11 function-pointers