如何使用 std::reference_wrapper<T>::operator()

How to use std::reference_wrapper<T>::operator()

我想使用与 std::reference_wrapper<T>::get“相同”的 std::reference_wrapper<T>::operator(),但是在 operator()

之后 example 失败
#include <cstdint>
#include <functional>

class Foo {
public:
  void Print() {
    std::printf("Foo\n");
  }
};

class Bar {
public:
  Bar(Foo &foo): wrapper{foo} {}
  void Print() {
    wrapper.get().Print();  // OK
    // wrapper().Print();   // FAIL
  }
private:
  std::reference_wrapper<Foo> wrapper;
};

int main() {
  Foo foo{};
  Bar bar{foo};
  bar.Print();
  return 0;
}

这可能吗?我的误会在哪里?

感谢您的帮助

兹拉坦

std::reference_wrapper

operator().get().

不同

它的 operator() 调用一个函数或其他 Callable 存储的引用引用的对象。

在您的示例中,Foo 对象不是 Callable。如果 Print 改为 operator(),那么您可以简单地用

调用它
wrapper();

Is this possible? Where is my misunderstanding?

没有。 std::reference_wrapper<T>::operator() 仅在 T::operator() 存在时存在,它只是调用它,转发提供的参数。

你是不是把它误认为是 std::reference_wrapper<T>::operator T&

class Bar {
public:
  Bar(Foo &foo): wrapper{foo} {}
  void Print() {
    Foo & f = wrapper;
    f.Print()
  }
private:
  std::reference_wrapper<Foo> wrapper;
};