2014-02-15 4 views
1

Пример для этой функции http://www.cplusplus.com/reference/functional/mem_fun/ говорит, что std :: string :: length может быть передан как последний параметр std;: transform. Из-за руководства, std :: string :: length не является статическим (исправьте меня, если я ошибаюсь)C++: использование mem fun для собственной структуры

Я предположил, что могу создать собственную структуру/класс и передать его член как последний параметр std :: transform , например:

struct ss 
{ 
    int ssFun(int n) 
    { 
    return 2*n; 
    } 
}; 

Так что я мог бы сделать следующее:

int tab[] = {1,2,3,4,5}; 
std::vector<int> inVect(tab, tab+5); 
std::vector<int> outVect; 
ss myStruct; 

outVect.resize(5); 
std::mem_fun(inVect.begin(), inVect.end(), outVect.begin(), mem_fun(&ss::ssFun)); 

Ни это:

std::mem_fun(inVect.begin(), inVect.end(), outVect.begin(), mem_fun(myStruct.ssFun)); 

Unfortuna Это не работает. Зачем?

+0

Вы имели в виду 'std :: transform' вместо' std :: mem_fun'? – Cornstalks

ответ

0

Проблема здесь std::mem_fun возвращает объект функции, который должен быть вызван с параметром, который является объектом, из которого вызывается функция-член. Например:

auto fun = std::mem_fun(&S::sayHello); 

S s; 
fun(s); // "Hello" 

Внутри std::transform, объект функтора вызываются с элементами вектора из [inVect.begin(), inVect.end()), которые являются целыми числами (не предназначено, чтобы быть объектами для вызова функций-членов на). Если диапазон этих элементов был элементами типа ss, он работал бы (вроде), но так как функция вызывается с int s, это не сработает. Чтобы обойти это, мы должны до std::bind использовать функцию-член до переменной экземпляра до начала std::transform.

std::transform(inVect.begin(), inVect.end(), 
       outVect.begin(), std::bind(&ss::ssFun, myStruct)); 
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Смежные вопросы