2014-12-10 2 views
0

Я закодировал шаблон общей функции, как показано ниже, который не создается.о передаче предиката в качестве аргумента шаблона

Он строит только в том случае, если предикат находится в папке const reference или by value.

Знаете ли вы, какой принцип C++ следует в этом случае?

Я использую g ++, и моя версия не содержит C++ 11.

Я проверил, что возвращает boost::bind, и он говорит unspecified type (я надеюсь, что прочитал правильно).

struct MyRecord{ 
    int a_; 
    int b_; 
}; 

template<class Predicate> 
bool isAny(Predicate &pred) { 
    vector<MyRecord>::iterator it = std::find_if(
      records.begin(), 
      records.end(), 
      pred); 
    if(it!=records.end()) { 
    // .. do something 
    } 
    return it != records.end(); 
} 

isAny(boost::bind(&MyRecord::a_,_1)==1); 
isAny(boost::bind(&MyRecord::b_,_1)==2); 

// It works with the 2 declarations below 
template<class Predicate> 
bool isAny(const Predicate &pred); 

// or 

template<class Predicate> 
bool isAny(Predicate pred); 
+0

Почему бы не 'isAny ([] (const MyRecord & record) {return record.a_ == 1;});'? – sjdowling

+0

Sorry.Forgot указать, что у меня нет C++ 11. –

ответ

3

Ваш звонок isAny(boost::bind(&MyRecord::a_,_1)==1); создает временный объект. В C++, временные может связываться только с константным опорным параметром или параметр значения. Идея состоит в том, что если функция принимает аргумент с помощью неконстантной ссылки, это означает изменить параметр, и изменение временного значения будет бессмысленным.

FWIW STL принимает предикаты по значению.

+0

Спасибо вам большое. Я об этом не думал. –

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