создание в c ++ вектора шаблонов, тип которых неизвестен (void templates) - PullRequest
1 голос
/ 05 февраля 2012

У меня есть шаблонный класс C ++, который содержит указатель метода и указатель класса, и который имеет единственный метод, call, который вызывает указатель метода на указатель класса.

Этот шаблон называется Method< C >, C является классом указателей класса и метода.

Я хочу создать массив (std::vector) этого шаблона, но я хочу, чтобы этот вектор мог содержать различные классы этого шаблона. Моя конечная цель - пройти через этот вектор и вызвать метод call каждого из элементов, даже если у них разные классы.

Как бы вы это сделали?

Ответы [ 2 ]

5 голосов
/ 05 февраля 2012

Вы не можете хранить template s в vector, только objects, которые имеют types. И template становится type, когда оно создается.

Итак, вы не можете делать именно то, что вы хотите.

Я рекомендую вам использовать function и bind. Смотрите пример:

struct A
{
    void call()
    {
        std::cout << "hello";
    }

};  

int main()
{
    std::vector <std::function<void()>> v;
    v.push_back(std::bind(&A::call, A()));
    for (auto it = v.begin(); it != v.end(); ++it) {
        (*it)();
    }

    return 0;
}

Это именно то, что вы хотите.

0 голосов
/ 05 февраля 2012

Если все методы имеют одну и ту же сигнатуру (относительно входных параметров и типа возвращаемого значения), вы можете заключить их в объекты std::function и сохранить их в векторе. В любом случае, звучит так, как будто вам нужно обернуть ваш класс в какой-нибудь полиморфный тип (или извлечь их из общей не шаблонной базы - но тогда вы заново изобретете std::function.)

Суть в том, что std::vector нельзя сделать для хранения разнородных типов.

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