繁体   English   中英

使用模板的非静态成员函数的C ++指针

[英]C++ Pointer to Non-static Member Function Using Templates

我在使成员函数指针正常工作时遇到了麻烦(我不知道我想做的事情是否可能)。 我想设置一个成员变量(它是另一个类中的非静态函数的指针),然后调用该函数。 然后,我希望能够将其设置为另一个派生类中的另一个成员函数并调用它。 2个派生类由模板创建,如下所示。 我可以做到这一点吗?如果可以,我在做什么错?

// Forward declare these, their implementation is irrelevant to the question 
class A;
class B;

// declare a base class that contains a function log() that we want to call
class BaseClass {
   public:
      BaseClass() {}
      virtual ~BaseClass() {}

      virtual void log() {}  // want to call this via function pointers
};

//Using a template means we don't have to specify the type in the vector  
template<class T>
class TemplateVectorOfBaseClass : public BaseClass {
   protected:
      std::vector<T> peripherals;      
}

//  this specific implementation does stuff using Class A
template <int randomTemplateParameter>
class DerivedTemplateClassThatDoesStuffWithAs : public BaseClass
    public:
       DerivedTemplateClassThatDoesStuffWithAs() : TemplateVectorOfBaseClass<A>() {}
       void log() {do_something_here_involving_As();}
       int i[randomTemplateParameter];
};

//  this specific implementation does stuff using Class B
template <int randomTemplateParameter>
class DerivedTemplateClassThatDoesStuffWithBs : public BaseClass
    public:
       DerivedTemplateClassThatDoesStuffWithBs() : TemplateVectorOfBaseClass<B>() {}
       void log() {do_something_here_involving_Bs();}
       float f[randomTemplateParameter];  
};

// Class that contains both templates as member variables    
class ContainerClass {
   public:
      ContainerClass();

      DerivedTemplateClassThatDoesStuffWithAs dtca<5>;
      DerivedTemplateClassThatDoesStuffWithBs dtcb<10>;

      void (BaseClass::*log)();  // pointer to member function log()
    }

// usage
ContainerClass cc;

cc.container.log = &dtca.log;
cc.*log(); // should call vectorContainingAs.log()

cc.container.log = &dtcb.log;
cc.*log(); // should call vectorContainingBs.log()

我真的不能依靠您的代码,因为它充满了错误,因此这是它与简化版本一起使用的方式:

class A { } ;
class B { } ;    

class BaseClass {
public:
    virtual void log () {
        std::cout << "Log BaseClass." << std::endl ;
    }
};

template <class T>
class TVector : public BaseClass { } ;

template <int N>
class DTCA : public TVector <A> { 
public:
    virtual void log () { 
        std::cout << "Log DTCA." << std::endl ;
    }
} ;

template <int N>
class DTCB : public TVector <B> { 
public:
    virtual void log () {
        std::cout << "Log DTCB." << std::endl ;
    }
} ;

class Container {
public:
    DTCA <5> dtca ;
    DTDB <10> dtcb ;
    void (BaseClass::*log) () ;
} ;

我认为上一部分中的错误是由于不良的复制/粘贴所致。 您最主要的错误是将方法分配给指针的方法以及在对象上调用方法的方法:

int main () {
    Container cc ;
    cc.log = &BaseClass::log ; // Store the log member function into cc.log

    (cc.dtca.*cc.log) () ; // Call it on dtca
    (cc.dtcb.*cc.log) () ; // Call it on dtcb

    return 0 ;
}

输出:

记录DTCA。

记录DTCB。

您不能从实例中获取方法的地址,您将得到类似以下内容的信息:

ISO C ++禁止使用绑定的成员函数的地址形成指向成员函数的指针。

因此,您将地址带到方法中,因为变量的类型是(BaseClass::*)()您需要直接从BaseClass获取它。 然后,您需要使用BaseClass实例或派生类来调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM