如果您希望您的模板绑定到不同的引用类型,则需要使用通用引用
template<typename T>
void func(T&& arg)
{
other_func(std::forward<T>(arg));
}
这将绑定到左值或右值引用。std::forward 将确保在后续调用中使用适当的引用。我不确定如何将双 & 号放入您的代码中,但也许只是
template<typename T>
void CallFoo(void(T::*func)(int)&&)
也许会更好
template<typename func_t>
void CallFoo(func_t && f)
{
call(std::forward<func_t>(f));
}
template<typename func_t>
void call(typename std::remove_reference<func_t> & f)
{
f();
}
template<typename func_t>
void call(typename std::remove_reference<func_t> && f)
{
f();
}
或调用函数指针所需的任何语法,可能是 *f();
如果你也想传递参数:
template<typename func_t, typename ... args_t>
void CallFoo(func_t && f, args_t && ... args)
{
call(std::forward<func_t>(f), std::forward<args_t>(args)...);
}
template<typename func_t, typename ... args_t>
void call(typename std::remove_reference<func_t> & f, args_t && ... args)
{
f(std::forward<args_t>(args)...);
}
template<typename func_t, typename ... args_t>
void call(typename std::remove_reference<func_t> && f, args_t && ... args)
{
f(std::forward<args_t>(args)...);
}