使用模板调用类的函数

Calling a function of a class using templates

本文关键字:函数 调用      更新时间:2023-10-16

我可能在这里要求一些荒谬的东西(而且我是c++的新手),但我仍然想尝试一下。我试图访问函数中一个类的方法,该函数接收类的对象,但同时,我不想以某种方式指定它是哪个类,这就是我使用模板的原因。这听起来非常愚蠢,但无论如何,这就是代码:

class Dog;
class Animals{
public:
// initializes all protected variables
Animals(string fam, string gen, string espec, string subespec);
~Animals();
template <class A>
void Eat(A &);
protected:
    string family;
    string genre;
    string especies;
    string subespecies;
};
template <class A>
void Animals::Eat(A &obj)
{
    // this is where I don't know what I could do.
    std::cout << obj.methodOfA();
}

/---

int main()
{
    Dog *myDog = new Dog;
    myDog->Eat(myDog);
    //supposing I had class "Cats"
    Cat *myCat = new Cat;
    myCat->Eat(myCat);
}

这可能很愚蠢,所以请随意指出我在答案上的愚蠢。。。如果有人回答这个问题的话。我想要这个,因为我将有许多派生自类Animals的类,并且独立于这些类中的哪一个,我希望它们能够正确地使用这个方法。

谢谢。

解决问题的一种方法是将要执行的函数作为第二个参数传递。然后您可以使用operator.*operator->*调用该函数。

这可能看起来像这样:

class Animals {
public:
// initializes all protected variables
Animals(std::string fam, std::string gen, std::string espec, std::string subespec);
~Animals();
template <class A, class Fun>
void Eat(A *&, Fun);
protected:
    std::string family;
    std::string genre;
    std::string especies;
    std::string subespecies;
};
template <class A, class Fun>
void Animals::Eat(A *& obj, Fun function)
{
    std::cout << ((obj->*function)()).c_str();
}

class Dog : public Animals {
public:
    std::string TestFunction() {
        return std::string("I am a dog");
    }
};

int main() {
    Dog *myDog = new Dog;
    myDog->Eat(myDog, &Dog::TestFunction);
    //...
}

该程序的输出为:

I am a dog

澄清这一行:

((obj->*function)())

首先将operator->*应用于obj,并将成员函数function的地址传递给它。请注意,你必须在这个陈述周围加上偏执狂。然后调用它。(())。

如果有任何关于上述代码的问题,请随时询问。

问候,

Philinator