【问题标题】:C++ : Instanciate template method based on overloads of another methodC ++:基于另一个方法的重载实例化模板方法
【发布时间】:2022-01-01 11:20:04
【问题描述】:

我有一个方法(在 A 类中)有很多不同的重载,我正在创建一个从 A 继承的 B 类,改变方法的行为以在执行最初的操作之前执行某个操作.问题是必须对所有重载进行此更改,这可以使用模板来完成。

class A{
  public:
  void method(int);
  void method(double);
  void method(char);
};

class B : protected A{
  public:
  template<typename T>
  void method(T t){
    A::method(t);
  }
};

事实上这确实有效,但是使用模板意味着将方法的新代码放在类声明中(即在标题中),这有点乱,我觉得必须有一种方法将代码放在单独的文件中。有一种方法可以做到这一点,那就是将重新定义的方法 B::method() 的代码移动到一个单独的文件中,并为每个重载手动实例化它。如果重载的数量变大,这会很乏味,而且感觉很不自然。所以,因此我的问题是:有没有办法直接告诉编译器为每种有效的类型实例化模板方法 B::method() ? (即对于每个类型 A::method 都被重载)

【问题讨论】:

    标签: c++ templates overloading template-instantiation


    【解决方案1】:

    您可以使用using Base::member_id; 公开私有/受保护基的成员:

    class A{
      public:
      void method(int);
      void method(double);
      void method(char);
    };
    
    class B : protected A{
      public:
        using A::method;
    };
    
    int main() {
        B foo;
    
        foo.method(12);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多