C++ 接受可变lambda时std::函数的签名

C++ 接受可变lambda时std::函数的签名,c++,lambda,C++,Lambda,假设我有一个lambda和一个类;我想将lambda作为静态变量分配给类。我怎么能这么做 auto func = [](void* p, auto&&... args) { /* do things */}; class A { static std::function<void(void*, ???)> f_; }; 然后它抱怨不完整类型“class std::function”的使用无效 请帮忙 std::function是一个函数包装器;它不是函数模板包装

假设我有一个lambda和一个类;我想将lambda作为静态变量分配给类。我怎么能这么做

auto func = [](void* p, auto&&... args) { /* do things */};
class A {
  static std::function<void(void*, ???)> f_;
};
然后它抱怨
不完整类型“class std::function”的使用无效


请帮忙

std::function
是一个函数包装器;它不是函数模板包装器。它必须有一组特定的参数。例如,对于参数列表
int、double、float
,您可以这样做:

inline static std::function<void(void*, int, float, double)> f_ = func;

但是当我喜欢的时候

A::f_ = func;
A::f_ = func;
然后它在抱怨

这是因为您没有将模板参数传递给模板变量。这将有助于:

A::f_<int, double, float> = func;
A::f_=func;

std::function
是一个函数包装器;它不是函数模板包装器。它必须有一组特定的参数。例如,对于参数列表
int、double、float
,您可以这样做:

inline static std::function<void(void*, int, float, double)> f_ = func;

但是当我喜欢的时候

A::f_ = func;
A::f_ = func;
然后它在抱怨

这是因为您没有将模板参数传递给模板变量。这将有助于:

A::f_<int, double, float> = func;
A::f_=func;

静态decltype(func)f_u=func
为什么它必须是
std::function
?因为我打算模板化类A,这样每个专门化都会根据分配给它的
func\uuuz
有不同的签名。
std::function
只提供一个非模板化的
操作符()重载,其签名由模板参数确定。如果
f\u
是一个
std::function
,那么就没有魔法可以让
A::f\u>可以用不同数量的参数调用。我不清楚您想要实现什么,但是
std::function
无法实现。您可以:
模板类A{static std::function f_;}
,因此
A
将具有
std::function
static decltype(func)f_=func
为什么它必须是
std::function
?因为我打算模板化类A,这样每个专门化都会根据分配给它的
func\uuuz
有不同的签名。
std::function
只提供一个非模板化的
操作符()重载,其签名由模板参数确定。如果
f\u
是一个
std::function
,那么就没有魔法可以让
A::f\u>可以用不同数量的参数调用。我不清楚您想要实现什么,但是
std::function
无法实现。您可以:
模板类A{static std::function f_;},因此
A
将具有
std::function