C++:实现在匿名结构中定义的函数

Zor*_*Hut 4 c++

给出以下代码:

class Named {
  class /*Unnamed*/ {
    void Function();
  } un;
};

// Implement Named::Unnamed::Function here

int main() {
  Named named;
  named.un.Function();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现Named :: Unnamed :: Function而无需命名Unnamed或在Named的定义中嵌入函数的定义?

我猜测答案是"不",但是GCC给了我一个有用的信息"未命名的引用`Named :: {unnamed type#2} :: Function()',它发生在我身上可能有些疯狂的可能句法.

Xeo*_*Xeo 12

这实际上是可能的(在C++ 11中),并且有两种方式:

struct Named {
  struct /*Unnamed*/ {
    void Function();
  } un;
  typedef decltype(un) Unnamed;
};

// #1
void Named::Unnamed::Function(){
}

//// #2
//typedef decltype(Named::un) Unnamed;
//void Unnamed::Function(){
//}
//// same way, using template alias
//template<class T> using alias = T;
//void alias<decltype(Unnamed::un)>::Function(){
//}

int main() {
  Named named;
  named.un.Function();
}
Run Code Online (Sandbox Code Playgroud)

Ideone上的实例.

这可以归功于$9.1 [class.name] p5:

命名类类型或其cv限定版本的typedef-name(7.1.3)也是类名.