gpt4 book ai didi

C++ 如何绑定(bind)和调用模板化类型方法

转载 作者:行者123 更新时间:2023-11-30 03:31:08 25 4
gpt4 key购买 nike

我正在尝试理解绑定(bind)到模板化类型方法的语法。 This似乎与我的问题相似,但似乎没有给出绑定(bind)和调用模板化类型方法的示例。

这是我的代码示例:

#include <functional>
#include <iostream>

using namespace std;

void DidSomething(int x)
{
cout << "Did something x = " << x << endl;
}

template <typename T>
class Outer
{
public:
void StartSomething()
{
Inner inner;

// below lines cause
// error C2893 Failed to specialize function template
//'unknown-type std::invoke(_Callable &&,_Types &&...)'

auto fnGlobal = std::bind(&::DidSomething);
inner.DoOneThing(fnGlobal);

auto fnMethod = std::bind(&Outer<T>::DidSomething, this);
inner.DoOneThing(fnMethod);
}

void DidSomething(int x)
{
cout << "Did something x = " << x << endl;
}

// example typedef, the actual callback has a lot of args (5 args)
typedef std::function<void(int)> DidSomethingCallback;

private:

class Inner
{
public:
void DoOneThing(DidSomethingCallback fnDidSomething)
{
fnDidSomething(3);
}
};

T t;
};

int main()
{
Outer<bool> outer;
outer.StartSomething();

return 0;
}

最佳答案

std::bind 要求您为未绑定(bind)的参数指定占位符,以便返回类型知道预期有多少参数以及将它们传递到何处。因此你必须写:

auto fnGlobal = std::bind(&::DidSomething, std::placeholders::_1);

告诉它 fnGlobal 接受一个参数并且应该用那个参数调用 ::DidSomething。否则,fnGlobal 将不接受任何参数。同样

auto fnMethod = std::bind(&Outer<T>::DidSomething, this, std::placeholders::_1);

将使 fnMethod 接受一个参数,将其称为 x,然后调用 this->DidSomething(x)。如果没有占位符,fnMethod 将不接受任何参数。

std::bind 的笨拙使得在许多情况下最好避免使用它。在第一种情况下,编写就足够了

// the & is optional
auto fnGlobal = ::DidSomething;

使 fnGlobal 成为一个普通的函数指针。在第二种情况下,可以使用 lambda:

auto fnMethod = [this](int x) { DidSomething(x); };

关于C++ 如何绑定(bind)和调用模板化类型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445567/

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