我有像这样的模板功能
template < typename T>
void Foo::func(T t)
{
}
调用函数
void FOO::func2()
{
std::function<void(const Foo&)> mp;
mp = std::bind(&Foo::func);
...
..
..
//Finally
mp();
}
这给出了编译错误,因为我没有指定类型mp = std::bind(&Foo::func);
。问题是我不知道那时的类型,但后来我才知道。有什么想法吗?
答案 0 :(得分:2)
成员函数必须绑定到this
,并且必须实例化模板:
std::function<void(const FOO&)> mp;
mp = std::bind(&FOO::func<const FOO&>, this, std::placeholders::_1);
mp(*this);
现在,如果你不知道bind
点输入参数的类型,一种替代方法是使用通用lambda而不是std::bind
和std::function
:< / p>
void FOO::func2() {
auto mp = [this](auto t) { func(t); };
...
mp(/*call here with what ever*/);
}
答案 1 :(得分:1)
导致编译失败的代码存在一些问题。
bind
这样的成员函数时,您需要绑定一个引用或指向有效对象的引用(this
)。bind
需要占位符,基本上断言将为该&#34;地点&#34;提供参数。调用仿函数时。std::function
时,您还需要提供适当的参数。所以,最后代码看起来像;
mp = std::bind(&Foo::func<const Foo&>, this, std::placeholders::_1);
// ^^^ the placeholder
// ^^^^ an object
// ^^^ template argument
mp(*this);
// ^^^ the argument for the std::function
注意:&#34;类型&#34;必须匹配(或转换为)std::function
中指定的类型。
std::function<void(const Foo&)> mp;
这是接受const Foo&
并返回void
的函数的函数包装器。支持&#34;未知&#34;类型场景,通用lambda更适合这个目的。
auto mp = [this](auto arg) { return this->func(arg); };
为了支持仅移动类型(例如std::unique_ptr<>
),lambda可以修改如下;
auto mp = [this](auto&& arg) {
return this->func(std::forward<decltype(arg)>(arg));
};