запуск функции над группой шаблонных объектов - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь создать шаблон класса, который будет иметь вектор объектов и который сможет запускать функцию класса объектов на них, поэтому мне не нужно зацикливать объекты и запускать класс, который я мог бы простоПраво что-то вроде

allObjects.runFunc(objectsType::someFunc); 

в классе я хочу 3 команды:

  • add - который добавляет элемент в группу
  • remove -получает элемент
  • runFunc(someFunc) - это самый важный элемент, и я хочу, чтобы он запускал someFunc для всех объектов в группе

, и класс получитодна переменная:
std::vector<Object> objects - которая будет хранить все объекты

, поэтому я много смотрел в интернете и не нашел то, что мне нужно, но я попробовал использовать std :: bind и получил некоторые действительно странные глюки.

класс (в файле .h):

#pragma once
#include <vector>


template<class Object>
class Group {
public:
    void add(Object &object);
    void runFunc(void(Object::* func)(void));

private:
    std::vector<Object> objects;
};

template<class Object>
inline void Group<Object>::add(Object &object)
{
    objects.push_back(object);
}

template<class Object>
inline void Group<Object>::runFunc(void (Object::* func)(void))
{
    for (int i = 0; i < objects.size(); i++)
    {
        (objects[i].func)();
    }
}

ошибка, которую я получаю: func не является членом gameObject, где gameobject - это тип, на котором я тестирую группу,и да, у него есть функция обновления.

1 Ответ

3 голосов
/ 20 сентября 2019

Ваш вызов выглядит неправильно (думаю: func - указатель на функцию):

Замените эту строку:

(objects[i].func)();

на

(objects[i].*func)();

Как говорится, я настоятельно рекомендую использовать std::function и, возможно, также std::bind вместо ' необработанных указателей на функции ' (когда кажется, что вы не ограничены сторонней библиотекой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...