2014-02-20 3 views
1

Я искал, но ближайший link, среди найденных, даже не соответствует моей проблеме. У меня есть массив std::vector<double> mydata. Мне нравится использовать for_each для этого массива mydata при вызове функции-члена. Эта функция-член принимает два аргумента. Каждый из них является элементом массива mydata, а другой - int* другого массива. Я люблюИспользование std :: for_each при вызове функции с несколькими аргументами

::std::for_each (mydata.begin(), mydata.end(), train(net)); 

Это дает мне ошибку компиляции train функции не принимает один аргумент. Я знаю, как использовать for_each, если нет int*.

Моя функция поезд

void train(double const & data, int* d){} 

Как я могу заставить его работать? Благодаря

+0

Вы можете не поставить по умолчанию для INT * D? –

ответ

5

пытаются использовать лямбда-функции:

std::for_each (mydata.begin(), mydata.end(), [&](double d) 
{ 
    train(d, net); 
}); 
+0

Зачем брать 'net' по ссылке? Я бы сделал '[net] (double d) {train (d, net); } '- просто скопируйте указатель. – MSalters

+0

Не могли бы вы объяснить, почему это работает? –

4

Если у вас есть C++ 11 вы можете использовать std::bind:

using namespace std::placeholders; // For `_1` 

std::for_each (mydata.begin(), mydata.end(), 
       std::bind(&MyClass::train, this, _1, net)); 

Здесь член-функция будет вызвана с три аргумента: первый является this указатель, который всегда скрытый первый аргумент во всех функциях-членах. Второй будет первым аргументом, переданным вызываемому объекту, созданным std::bind, а третьим аргументом является переменная net.

+0

Зачем использовать 'std :: bind', когда лямбда намного проще. (В pre-C++ 11 это было бы хорошим использованием 'boost :: bind'.) –

+0

@JamesKanze Не думал об этом, пока я уже не написал свой ответ. И поэтому я поддержал ответ от Александра. :) –

+0

Семантика 'bind' более ясная, чем функция лямбда-функции, на мой взгляд. –

Смежные вопросы