c++ - 是否有一种技术可以让匿名结构的命名实例引用封闭类中的函数?

标签 c++ struct c++14 crtp gcc7

我有一个 CRTP 类,为了在重构过程中 API 清晰,我希望有一个包含方法的命名匿名结构,而不是在类范围内拥有所有方法。问题是,这些方法需要访问外部作用域。例如:

template<typename T>
class sample_class {
public:
   struct  {
      void do_something() {
          auto& result = get_ref().something_else(); //get_ref() out of inner struct scope
          ...
      }
   } inner;

private:
  T& get_ref() { return static_cast<T&>(*this); }
};

是否有一些技术可以实现这项工作?特别是 C++14 和 gcc7,因为我不相信匿名结构在技术上符合标准。

最佳答案

另一个类中的类没有指向封闭类的 this 指针的隐式指针。

如果您希望它具有指向封闭类实例的指针,请显式存储它。

struct  {
  void do_something() {
    auto& result = p_sample->get_ref().something_else(); //get_ref() out of inner struct scope
    ...
  }
  sample* p_sample;
} inner;

或者传入指向方法的指针:

  void do_something(sample* psample) {
    auto& result = p_sample->get_ref().something_else(); //get_ref() out of inner struct scope
    ...
  }

有一些方法可以使用指针算术来生成看似指向外部类的指针,但它们在 C++ 中受到极其复杂和危险的规则的限制。

除了一些访问/命名规则等之外,其他类中定义的类并不神奇。它们(理论上)可以存在于其他环境中; 内部可以存在于堆栈中的某个地方,而不是在示例中。

关于c++ - 是否有一种技术可以让匿名结构的命名实例引用封闭类中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71117785/

相关文章:

c++ - 为什么可以间接地将右值绑定(bind)到左值引用而不是直接绑定(bind)?

c++ - OpenGL:使用球坐标在球体上映射纹理

c++ - opengl 台球数组

c# - 如果您可以创建不可为空的引用类型怎么办?

c++ - 将结构变量从函数存储到局部结构变量

c - 如何使用函数在 header 中声明并在源代码中定义的结构

c++ - 显式默认构造函数

c++ - 在 RPI 上编译 ROS 在 opencv 上失败, undefined reference 'header'

c++ - 具有不同返回类型的成员函数的模板化别名

C++14 regex_search 0 匹配