我什么时候需要匿名类C++

When do I need anonymous class in C++?

本文关键字:C++ 什么时候      更新时间:2023-10-16

C++中有一个叫做匿名类的功能。这与 C 中的匿名结构类似。我认为这个功能是因为某些需要而发明的,但我无法弄清楚那是什么。

我可以举一些真正需要匿名类的例子吗?

该功能之所以存在,是因为structclass是一回事 - 你可以用一个做什么,你可以用另一个做。它与 C 中的匿名struct完全相同;当您想要将某些内容组合在一起并声明它的一个或多个实例时,但不需要按名称引用该类型。

它在C++中不太常用,部分原因是C++设计往往更面向类型,部分原因是您无法为匿名类声明构造函数或析构函数。

严格意义上并不是真正需要的,而且从来没有。 也就是说,您始终可以分配一个名称,例如anonymous1anonymous2等。但是跟踪比必要更多的名称总是很麻烦。

有用的地方是在任何想要对数据进行分组而不为该组命名的地方。我可以举几个例子:

class foo {
  class {
  public:
    void validate( int x ) { m_x = x; }
    bool valid() { return m_exists; }
  private:
    int m_x;
    bool m_exists;
  } maybe_x;
};

在这种情况下,intbool在逻辑上属于一起,因此将它们分组是有意义的。但是,对于此具体示例,创建实际的可选类型或使用可用类型之一可能是有意义的,因为此模式很可能也在其他地方使用。在其他情况下,这种分组模式可能非常特殊,以至于它只应该留在该类中。

不过,我确实假设匿名类很少使用(我一生中可能只使用过几次)。通常,当想要对数据进行分组时,这不是特定于类或范围的,而是一种分组,这在其他地方也很有意义。

也许有时制作嵌套函数会有所帮助,例如:

void foo() {
  class {
    void operator()(){
    }
  } bar;
  bar();
}

但是现在我们有 lambda,匿名类只是出于兼容性原因而保留。

使用匿名类是为了保持与现有 C 代码的兼容性。例:

在某些 C 代码中,将 typedef 与匿名结构结合使用很普遍。

有一个匿名结构的例子,可以与Qt 5的Signal/Slot系统一起使用,具有任何类,并且没有QObject导数要求:

void WorkspaceWidget::wwShowEvent()
{
    //Show event: query a reload of the saved state and geometry
    gcmessage("wwShowEvent "+ this->title());
    struct{void* t; void operator()(){ static_cast<WorkspaceWidget*>(t)->wwReloadWindowState(); }}f;
    f.t=this;
    QObject::connect( &reloadStateTimer, &QTimer::timeout, f);
    reloadStateTimer.start();
}
void WorkspaceWidget::wwReloadWindowState()
{
    gcmessage( dynamic_cast<QObject*>(this)->metaObject()->className());
}

基本上,我需要将定时器信号连接到非 QObject 派生类,但希望正确传递 mt"this"。

QObject::connect 可以连接到 Qt 5 中的普通函数,所以这个匿名类实际上是一个函子,它保留了 this 指针本身,仍然传递时隙连接。

您也可以在匿名中使用 auto 执行操作 (vs2015)

struct {
    auto* operator->() {return this;}
    //do other functions
} mystruct;