Как вызвать метод класса, объект которого находится внутри функции - PullRequest
0 голосов
/ 10 октября 2019

Как вызвать метод класса GetItemList, который принимает в качестве входных данных метод другого класса (B, C или D), объект которого существует в классе Pro

Я пытаюсь вызвать

GetItemList<void, B>(&B::Show_B);

Я получаю

class B' has no member named 'func'

Как предотвратить создание нового объекта при вызове std :: function

Объекты для списка

class A
{
};

class B : public A
{
public:
    void Show_B()
    {
        std::cout << "Class B" << std::endl;
    };
};

class C : public A
{
public:
    void Show_C()
    {
        std::cout << "Class C" << std::endl;
    };
};

class D : public A
{
public:
    void Show_D()
    {
        std::cout << "Class D" << std::endl;
    }
};

typedef std::vector<A*> List;

Класс, который вызывает шаблон

class Pro
{
private:
    List* m_list;

public:
    Pro(List* list)
    {
        m_list = list;

        // GetItemList<void, B>(&B::Show_B);
        // GetItemList<void, C>(&C::Show_C);
        // GetItemList<void, D>(&D::Show_D);
    }

    template <typename V, typename T> void GetItemList(std::function<V(T*)> func)
    {
        T* pointer = nullptr;
        for(auto& p : *m_list) {
            pointer = dynamic_cast<T*>(p);
            if(pointer != nullptr)
                pointer->func();
        }
    }
};

Основная функция

void Main()
{
    List list;
    list.push_back(new B);
    list.push_back(new C);
    list.push_back(new D);

    Pro pro(&list);
}

1 Ответ

2 голосов
/ 10 октября 2019

Это должно быть

template <typename V, typename T> void GetItemList(std::function<V(T*)> func)
{
    T* pointer = nullptr;
    for (auto& p : *m_list) {
        pointer = dynamic_cast<T*>(p);
        if(pointer != nullptr)
            func(pointer);
    }
}

Демо

...