【问题标题】:Why can I connect this struct in boost::signals2?为什么我可以在 boost::signals2 中连接这个结构?
【发布时间】:2014-12-02 18:41:26
【问题描述】:

boost signals2 库在其tutorial 中包含以下代码:

struct HelloWorld
{
  void operator()() const
  {
    std::cout << "Hello, World!" << std::endl;
  }
};
boost::signals2::signal<void ()> sig;

HelloWorld hello;
sig.connect(hello); (*)

sig();

但是,我无法理解为什么会这样。据我所知,connect 应该得到一个 void() 方法,但它在 (*) 中得到一个 HelloWorld&amp;。为什么这甚至行得通?

【问题讨论】:

  • 你读过tutorial吗?此外,请关注每个帖子的一个 问题,并确保这个特定问题很突出。
  • 称为函子类。
  • @Zeta 我打赌 OP 应该专注于两者之一。看来他paired down a three-in-one question 进入了一个二合一问题。仍然不完全正确,但是是的。
  • @sehe 感谢您的回答。我正在等到我可以接受它作为答案。现在我有一些东西要开始阅读了。
  • 我试图挽救这个问题。我已将您的问题合并为一个问题,这不会使 sehe 或 reymabel 的答案无效。

标签: c++ boost struct


【解决方案1】:

该结构通常被称为“函子”。

实际上它是一个重载函数调用运算符(operator())的常规对象,所以你可以这样做:

struct X { void operator()(int x) { std::cout << x << "\n"; } };

int main() {
    X printer;
    printer(3);
}

这会将3 打印到std::cout。


Boost Signals2 接受任何“可调用对象”。

这包括

  • 函子
  • 函数指针
  • 任何隐式转换为函数指针的对象
  • ...

参考例如http://en.cppreference.com/w/cpp/concept/Callable了解更多信息

【讨论】:

    【解决方案2】:

    首先,HelloWorld 有一个“函数调用”运算符,如 [over.call] 中所述:

    operator() 应该是一个非静态成员函数,具有任意 参数数量。它可以有默认参数。它实现了 函数调用语法

                   后缀表达式 (表达式列表opt)

    其中后缀表达式计算为一个类对象,而 可能为空 expression-list 匹配一个参数列表 operator() 类的成员函数。因此,致电x(arg1,...) 对于类对象x 被解释为x.operator()(arg1, ...) 键入T ifT::operator()(T1, T2, T3) 存在并且如果运算符是 被重载决议选为最佳匹配函数 机制(13.3.3)。

    您传递了结构的实例,sig() 将在实例上调用operator()。

    请参阅 boost 文档中的 tutorial。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多