从 std::function 推导出模板参数
Deducing template parameters from std::function
我正在写一些 class 使用静态模板成员函数试图映射 std::function 及其参数 :
class test
{
public:
template <typename R, typename... Args>
static double exec(std::function<R(Args...)> func, Args && ... args) {
func(std::forward<Args>(args)...);
// do something
return 0.0;
}
};
假设我有这些琐碎的功能:
void f1() { ; }
int f2(int v) { return v; }
double f3(int v1, float v2) { return (double)v1 * (double)v2; }
我想这样调用我的 test::exec
函数:
test::exec(f1);
test::exec(f2, 4);
test::exec(f3, 1, 3.14f);
我正在使用 Visual Studio,我在第二种情况 (f2) 中遇到此错误:
error C2672: 'test::exec': no matching overloaded function found
error C2784: 'double test::exec(std::function<_Ret(_Types...)>,Args &&...)': could not deduce template argument for 'std::function<_Ret(_Types...)>' from 'int (__cdecl *)(int)'
不过,如果我在模板签名中指定类型,它会起作用:test::exec<int, int>(sq, 4);
显然,我想避免这种情况。另外,我不知道如何用这种语法来表达对 f1 的调用。
是否可以在不指定模板参数签名的情况下实现这个目标?
编译器无法推断出 std:function
参数和 return 类型,因为您根本没有传递 exec
一个 std::function
。
而不是 std::function
,您可以让 exec
接受任意类型的可调用对象(包括函数),并让编译器推断其签名:
template <typename Func, typename... Args>
static double exec(Func func, Args && ... args);
如果您确实需要知道传递给 exec
的函数的 return 类型,您可以这样做:
template <typename Func, typename... Args>
static double exec(Func func, Args && ... args)
{
using R = decltype(func(args...));
// ...
}
答案改编自@IgorTandetnik 的评论。
我正在写一些 class 使用静态模板成员函数试图映射 std::function 及其参数 :
class test
{
public:
template <typename R, typename... Args>
static double exec(std::function<R(Args...)> func, Args && ... args) {
func(std::forward<Args>(args)...);
// do something
return 0.0;
}
};
假设我有这些琐碎的功能:
void f1() { ; }
int f2(int v) { return v; }
double f3(int v1, float v2) { return (double)v1 * (double)v2; }
我想这样调用我的 test::exec
函数:
test::exec(f1);
test::exec(f2, 4);
test::exec(f3, 1, 3.14f);
我正在使用 Visual Studio,我在第二种情况 (f2) 中遇到此错误:
error C2672: 'test::exec': no matching overloaded function found
error C2784: 'double test::exec(std::function<_Ret(_Types...)>,Args &&...)': could not deduce template argument for 'std::function<_Ret(_Types...)>' from 'int (__cdecl *)(int)'
不过,如果我在模板签名中指定类型,它会起作用:test::exec<int, int>(sq, 4);
显然,我想避免这种情况。另外,我不知道如何用这种语法来表达对 f1 的调用。
是否可以在不指定模板参数签名的情况下实现这个目标?
编译器无法推断出 std:function
参数和 return 类型,因为您根本没有传递 exec
一个 std::function
。
而不是 std::function
,您可以让 exec
接受任意类型的可调用对象(包括函数),并让编译器推断其签名:
template <typename Func, typename... Args>
static double exec(Func func, Args && ... args);
如果您确实需要知道传递给 exec
的函数的 return 类型,您可以这样做:
template <typename Func, typename... Args>
static double exec(Func func, Args && ... args)
{
using R = decltype(func(args...));
// ...
}
答案改编自@IgorTandetnik 的评论。