定义具有回调类型的结构体模板作为类的数据成员,同时使用类函数成员作为数据成员的回调

问题描述 投票:0回答:1

我收到以下示例的编译错误:

template<typename Callback>
struct CallBackStruct {
    CallBackStruct(uint freq, Callback callback) :
            freq_(freq), cb_(std::move(callback)) {
    }

private:
    void loop() {
        for (int i= 0; <interval_; ++i){
           cb_();
        }
    }
    uint                  freq_;
    Callback              cb_;
};

现在我需要定义一个具有 CallBackStruct 变量的类,例如:

class MyTestClass final {
 public:
     MyTestClass (string name): name_(name){} 
     void start_testing();
     void stop_testing();

private:
  void method1 (int v);
  void method2 (int v);
  void method3 (int v);
  
  string name_;

  CallBackStruct<&decltype(MyTestClass::method1)> t1;
  CallBackStruct<&decltype(MyTestClass::method2> t2;
  CallBackStruct<&decltype(MyTestClass::method3> t3;

};

我计划在 MyTestClass::start_testing() 方法中初始化并实例化 CallBackStruct 结构的对象。喜欢

void MyClassTest::start_testing() {
  t1 = CallBackStruct(freq1, [&]() {
     method1(freq1); });

  t2 = CallBackStruct(freq2, [&]() {
     method3(freq2); });

  t3 = CallBackStruct(freq3, [&]() {
     method3(freq3); });
}

但是当我尝试上面的代码时,我收到编译错误:

错误:没有匹配的函数可用于调用“CallBackStruct”

&)>::CallBackStruct()’ 86 |姓名_(姓名){}

有什么建议如何解决吗?是因为 t1、t2 和 t3 没有在 MyTestClass 构造函数中初始化吗?如果是这个问题,我该如何在构造函数中初始化它们。 我有一个限制,我无法更改 MyClassTest 构造函数,因为它已被其他现有组件使用。

c++ templates callback
1个回答
0
投票

您可以使用类内初始化程序。

class MyTestClass final {
 public:
     MyTestClass (string name): name_(name){} 
     void start_testing();
     void stop_testing();

private:
  void method1 (int v);
  void method2 (int v);
  void method3 (int v);
  
  string name_;

  CallBackStruct<decltype(&MyTestClass::method1)> t1{4,&MyTestClass::method1};
  CallBackStruct<decltype(&MyTestClass::method2)> t2{2,&MyTestClass::method2};
  CallBackStruct<void (MyTestClass::*)(int)> t3{3,&MyTestClass::method3};

};
© www.soinside.com 2019 - 2024. All rights reserved.