gpt4 book ai didi

c++ - std::function 表达式不会生成接受 1 个参数的函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:31 24 4
gpt4 key购买 nike

我正在学习使用 std::function 传递函数。我从 MSDN 站点获取了代码代码,它向我展示了如何了解进程是否已启动。

http://pastebin.com/gVkXZC9b

我知道函数 void signal_onProcessStart 不是必需的,我稍后会放大它。

我的问题是我的编译器告诉我 std::function 有一个错误。

表达式不会生成接受 1 个参数的函数。

我使用的是德文版的Visual Studio,所以我翻译了它。我认为该错误在英语中的称呼不同。

应触发的所有函数都将 void 作为“返回值”,并将 HRESULT* 作为唯一参数。

问候

编辑:

我做了一个同样错误的小例子:

#include<functional>
#include<iostream>
#include<Windows.h>

using namespace std;

class workingClass
{
private:
std::function<void(int)> f;
public:
workingClass(std::function<void(int)> p)
{
this->f = p;
}
void triggerme(int x)
{
this->f(x);
}
~workingClass(){}
};

class managingClass
{
private:
function<void(int)> f;
workingClass * ptr;
int x;
protected:
void trigger(int x)
{
this->f(x);
}
public:

managingClass(function<void(int)> f)
{
this->f = f;
function<void(int)> tmp = bind(&managingClass::trigger, this->x);
ptr = new workingClass(tmp);
ptr->triggerme(20);
}
~managingClass(){}
};

void triggered(int x)
{
cout << "it is triggered";
}

int main()
{
function<void(int)> t = bind(&triggered, 20);
managingClass temp(t);
system("pause");
}

文件功能中的错误行 1149表达式不会产生接受 1 的函数

最佳答案

您对 bind 的使用是不正确的。不使用任何占位符(_1 和类似的)的绑定(bind)表达式会产生一个没有参数的函数。 如果您有一个 void foo(int) , bind(&foo, 20) 的类型对应std::function<void()> . int参数绑定(bind)为 20,不能再从外部设置。

这就是bind用于 - 绑定(bind)一些参数,并可选择不绑定(bind)其他参数。例如,this will print 105 :

int foo(int x, int y, int z)
{ return x * y + z; }

int main()
{
using namespace std::placeholders;
std::function<int(int, int)> b = std::bind(&foo, _1, 10, _2);
std::cout << b(10, 5) << '\n';
}

此外,非静态成员函数在绑定(bind)时将一个对象(或指向对象的指针)作为它们的第一个参数。因此,例如,您可以执行 this :

struct Foo
{
int id;

int bar(int x) const
{ return 2 * x + id; }
};

int main()
{
using namespace std::placeholders;
Foo foo1 = {1};
Foo foo2 = {2};

std::function<int(int)> f1 = std::bind(&Foo::bar, foo1, _1);
std::cout << f1(10) << '\n'; // prints 21
std::cout << f1(20) << '\n'; // prints 41

std::function<int(const Foo&)> f2 = std::bind(&Foo::bar, _1, 10);
std::cout << f2(foo1) << '\n'; // prints 21;
std::cout << f2(foo2) << '\n'; // prints 22;

std::function<int()> f3 = std::bind(&Foo::bar, foo1, 40);
std::cout << f3() << '\n'; // prints 81;
}

我很难说出您究竟想用您的代码实现什么,但这些信息应该足以为您指明正确的方向。

关于c++ - std::function 表达式不会生成接受 1 个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22374119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com