模板函数类型C ++的后期绑定

时间:2016-05-10 06:45:00

标签: c++ maps bind

我有像这样的模板功能

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);。问题是我不知道那时的类型,但后来我才知道。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

成员函数必须绑定到this,并且必须实例化模板:

std::function<void(const FOO&)> mp;
mp = std::bind(&FOO::func<const FOO&>, this, std::placeholders::_1);
mp(*this);

Live Demo

现在,如果你不知道bind点输入参数的类型,一种替代方法是使用通用lambda而不是std::bindstd::function:< / p>

void FOO::func2() {
  auto mp = [this](auto t) { func(t); };
  ...
  mp(/*call here with what ever*/);
}

Live Demo

答案 1 :(得分:1)

导致编译失败的代码存在一些问题。

  1. 当您bind这样的成员函数时,您需要绑定一个引用或指向有效对象的引用(this)。
  2. bind需要占位符,基本上断言将为该&#34;地点&#34;提供参数。调用仿函数时。
  3. 调用std::function时,您还需要提供适当的参数。
  4. 所以,最后代码看起来像;

    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));
    };