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

时间:2012-02-05 01:28:24

标签: c++

给出以下代码:

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

// Implement Named::Unnamed::Function here

int main() {
  Named named;
  named.un.Function();
}

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

我猜答案是“不”,但是GCC给了我一个有用的信息“未定义引用`Named :: {unnamed type#2} :: Function()',它发生在我身上可能有一些疯狂的可能语法。

1 个答案:

答案 0 :(得分: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();
}

Live example on Ideone.

这要归功于$9.1 [class.name] p5

  

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