我一直很难理解 std::function
模板。似乎使用了我还不知道的魔法。它的模板参数是 class R
, class... ARGS
.但它可以作为 std::function<void>
传递给模板或 std::function<void()>
.带参数的示例:std::function<void, int, float>
或 std::function<void(int, float)>
.这第二种语法是在 c++11 中引入的吗?我认为这在之前是无效的。
此外,有没有办法获得 decltype
函数并将其传递给函数模板?这将使功能模板的设置变得更加容易。
这是一个例子:
#include <functional>
using namespace std;
///////////////////////////////////////////////////////////////////////////////
// this works
void x() {}
void y(int p0) {}
int main1()
{
using namespace std::placeholders;
function<decltype(y)> functors[] = { bind(x), bind(y, _1) };
functors[0](1);
functors[1](1);
return 0;
}
///////////////////////////////////////////////////////////////////////////////
// this doesn't work
struct X
{
void x() {}
void y(int p0) {}
void z(int i, int p0)
{
using namespace std::placeholders;
static function<decltype(&X::y)> functors[] = { bind(&X::x, _1), bind(&X::y, _1, _2) };
functors[i](this, p0);
}
};
int main2()
{
X xobj;
xobj.z(0, 1);
xobj.z(1, 1);
return 0;
}
int main()
{
return main1() + main2();
}
最佳答案
std::function
接受一个模板参数,它必须是一个函数类型。您不能使用 std::function<void, int, float>
. std::function<void(int, float)>
是唯一有效的语法。
std::function
在 C++11 中引入。没有 std::function
在此之前。有 std::tr1::function
但是,在 TR1 中定义,它使用相同的 std::function<void(int, float)>
语法。
关于c++ - 是否可以使函数模板从函数引用中获取 `decltype`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19281694/