как сделать шаблонную функцию для этого? - PullRequest
1 голос
/ 27 января 2012

У меня есть две очень похожие функции, и я хотел бы сделать из них функцию шаблона.

void func1(vector<vector<vector<struct1_type> > > &struct1_x, const int &x,
const int &y, struct2_type &struct2_y, list1<struct1_type> &l1)

и

void func2(vector<vector<vector<struct1_type> > > &struct1_x, const int &x,
const int &y, struct2_type &struct2_y, list2<struct1_type> &l2)

Функции делают одно и то же ... отличается только последний параметр, представляющий собой два разных класса для обработки списков.

Я пробовал множество вещей без результатов и из-за ошибок. Спасибо за любую помощь, вы можете предложить относительный новичок!

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Это то, для чего было изобретено template template.

template <template <typename> class list_type> 
void func1(vector<vector<vector<struct1_type> > > &struct1_x,
           const int &x,
           const int &y,
           struct2_type &struct2_y,
           list_type<struct1_type> &q1);

Обратите внимание, что шаблон должен соответствовать в точности . Например, вы не можете использовать std::list для параметра list_type, поскольку он не принимает один шаблон параметров - он принимает два: содержащийся тип и тип распределителя.

Может быть проще пойти с простым, не template template решением.

template <typename list_type> 
void func1(vector<vector<vector<struct1_type> > > &struct1_x,
           const int &x,
           const int &y,
           struct2_type &struct2_y,
           list_type &q1);

И ожидайте, что пользователь укажет list1<struct1_type> в качестве параметра шаблона. Это то, что std::stack, std::queue и std::priority_queue делают.

0 голосов
/ 27 января 2012

Вот как вы бы объявили шаблон функции, который обобщает ваши две функции:

template <typename L>
void func1(vector<vector<vector<struct1_type> > > &struct1_x, const int &x, const int &y, struct2_type &struct2_y, L &q1)

Это то, что вы имели в виду?

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