2014-10-23 4 views
1

Я изучаю boost lambda (не C++ 0X лямбда, потому что я думаю, что они разные). Но я не могу найти способ в Интернете вызывать функцию-член (а затем выводить результат), если единственным входным параметром является объект вызова. Я имею в виду эта линия работает:Boost лямбда-вызов функции

for_each(vecCt.begin(), vecCt.end(), cout<<_1<<endl); 

если vecCt является vector из int. Но что, если vecCt является vectorMyClass, который имеет функцию, называемую getName, чтобы вернуть строку? Ни это:

for_each(vecCt.begin(), vecCt.end(), cout<<_1->getName()); 

, ни это:

for_each(vecCt.begin(), vecCt.end(), cout<<*_1.getName()); 

работы.

Я искал в Интернете, но многие результаты предлагают использовать bind при вызове функции-члена. Теперь я знаю, что это

for_each(vecCt.begin(), vecCt.end(), bind(&MyClass::getName, _1); 

делает меня способным вызвать getName на каждом объекте передается междунар, но как я могу передать это выход на COUT? Это не работает:

for_each(vecCt.begin(), vecCt.end(), cout<<bind(&MyClass::.getName, _1); 
+1

Нашел: http://stackoverflow.com/questions/9762273/boost-lambda-dereference-placeholder – chris

+0

Определение не работает. – doctorlove

+0

@doctorlove Я предполагаю, что вы имеете в виду последнюю строку? Он не компилируется, и ошибка «не подходит для« оператора << »в« std :: cout << boost :: bind ... »« – tete

ответ

1

Вполне вероятно, вы смешиваете заполнители и функции от boost::, глобального boos::lambda (возможно, больше, как boost::phoenix тоже).

Вот неподвижная демо: Live On Coliru

#include <boost/lambda/lambda.hpp> 
#include <boost/lambda/bind.hpp> 
#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <string> 

struct X 
{ 
    int x; 
    std::string accessor() const { return "X[" + std::to_string(x) + "]"; } // I know, requires c++11 
}; 

int main() 
{ 
    std::vector<X> v; 
    v.push_back({ 1 }); 
    v.push_back({2}); 
    v.push_back({3}); 
    v.push_back({4}); 
    v.push_back({5}); 

    std::for_each(v.begin(), v.end(), 
     std::cout << boost::lambda::bind(&X::accessor, boost::lambda::_1) << "\n"); 
} 
+0

Благодарим вас за ответ. Я просто получаю сообщение об ошибке «bind не является членом boost :: lambda» (это опечатка, должна ли быть boost :: bind?). Я скомпилировал с использованием C++ со стандартом по умолчанию, который, я думаю, является C++ 98. Я также пробовал с C++ 0x, но с той же ошибкой. И если я попробовал boost :: bind с C++ 0x, ошибка компиляции отличается: невозможно привязать 'std :: ostream' lvalue к 'std :: basic_ostream' (исходная ошибка не соответствовала «operator <<») – tete

+1

Вы скопировали весь образец? Если это так, вы должны получить «boost/boost/lambda.hpp» или «boost/lambda/bind.hpp». Кроме того, если вы получите сообщение 'operator <<', вы, вероятно, все еще смешиваете/сопоставляете разные пространства имен. Попробуйте с моим точным кодом, отредактируйте его, пока не увидите, что делает ваш код другим – sehe

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

  • Нет связанных вопросов^_^