【问题标题】:C++: Implementing a function defined inside an anonymous structureC++:实现在匿名结构中定义的函数
【发布时间】:2012-02-27 02:31:00
【问题描述】:

给定以下代码:

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()' 的引用,我想到可能有一些疯狂的可能语法。

【问题讨论】:

  • 不会有“一些疯狂的语法”。显然,编译器将为每个实体分配某种名称,但这些名称是不可知的或不可用的。我想说一个外线定义需要一个函数的名称(构造函数除外),并且由于您无法命名该函数,因此您不能对其进行外线定义。
  • @whitelion:我没有,但这与问题无关。是的,确实有很多方法可以解决这个问题 - 我的意思是,一个明显的方法就是命名类 - 我只是好奇是否有办法避免解决方法。

标签: c++


【解决方案1】:

这实际上是可能的(在 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) 也是 class-name

【讨论】:

  • 优雅!不是我会想到的方法。不幸的是,我没有使用支持 C++11 的编译器,但您的解决方案绝对值得称赞 :)
猜你喜欢
  • 2018-01-05
  • 2019-05-02
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2019-09-28
  • 2019-02-10
  • 2013-04-18
  • 2020-10-28
相关资源
最近更新 更多