В конструкторе класса определите вектор типа T - PullRequest
0 голосов
/ 03 января 2019

Я уже могу определить вектор указателя на функцию с фиксированным типом параметра в заголовке public:, а затем обновить его в конструкторе. Но если я хочу иметь возможность передать вектор указателя на функцию с параметром любого типа, как я могу определить его до того, как конструктор обновит его?

#include <iostream>
#include <vector>

class foo {
public:
    std::vector<void (*)(int)> functions;

    foo(std::vector<void (*)(int)> x) {
        functions=x;
    }

    void run() {
        functions[0](2);
    }
};

void square(int n) { std::cout << n*n; }

int main() {
    foo* bar=new foo(std::vector<void (*)(int)>{square});
    bar->run();
    return 0;
}

Теперь, как я могу передать вектор конструктору любого типа?

//snippet from above
std::vector<void (*)()> functions; //what do i do here?

template <typename T>   
foo(std::vector<void (*)(T)> x) { //this works fine
    functions=x;
}

1 Ответ

0 голосов
/ 03 января 2019

Вместо этого вы можете превратить класс в шаблон класса

template<class T>
class foo {
public:
    std::vector<void (*)(T)> functions;
    foo(std::vector<void (*)(T)> x) : functions(x)
    { }
    ...
}

foo<int>* bar=new foo(std::vector<void (*)(int)>{square});

Я бы также порекомендовал переключиться с указателя функции на std :: function и не использовать необработанные указатели. Используйте std :: unique_ptr или одного из его двоюродных братьев.

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