В C ++, как я могу использовать функцию шаблона в качестве третьего параметра в std :: for_each? - PullRequest
3 голосов
/ 22 апреля 2009

Я пытаюсь использовать std :: for_each для вывода содержимого векторов, которые могут содержать разные типы. Поэтому я написал обобщенную функцию вывода так:

template<typename T> void output(const T& val)
{
    cout << val << endl;
}

, который я хотел бы использовать с:

std::for_each(vec_out.begin(), vec_out.end(), output);

но компилятор жалуется на "не удалось вывести аргумент шаблона" в выражении for_each. Также жалуется на «Шаблон функции не может быть аргументом для другого шаблона функции».

Разве это не возможно? Я бы подумал, что компилятор будет знать тип vec_out (это вектор) и поэтому должен создать экземпляр функции «output (const double & val)»? *

Если это не сработает, как я могу получить аналогичные функции STL без написания ручных циклов?

Я довольно новичок в C ++ и все еще изучаю веревки: -)

Ответы [ 3 ]

9 голосов
/ 22 апреля 2009

Попробуйте:

std::for_each(vec_out.begin(), vec_out.end(), output<T>);

где vec_out - контейнер (vector) типа T.

Примечание: алгоритм for_each ожидает унарный функтор для своего последнего аргумента. Смотрите ссылку для примера использования функторов.

7 голосов
/ 22 апреля 2009

Я просто хотел бы добавить к правильным ответам: компилятор может определить тип, если вы заключите свою функцию шаблона в объект функции (он же функтор):

struct OutputFunctor
{
  template <typename T>
  void operator()(const T& val) const { output(val); }
};

void test()
{
  std::vector<int> ints;
  std::vector<float> floats;

  std::for_each(ints.begin(), ints.end(), OutputFunctor());
  std::for_each(floats.begin(), floats.end(), OutputFunctor());
}
7 голосов
/ 22 апреля 2009

Вы должны пройти инстанцирование шаблона. Что-то вроде output<int>, если ваш вектор - вектор целых чисел.

Например:

template<typename T> void output(const T& val)
{
    cout << val << endl;
}



void main(int argc,char *argv[])
{
    std::vector<int> vec_out;
    std::for_each(vec_out.begin(), vec_out.end(), output<int>);
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...