关于将谓词作为模板参数传递

时间:2014-12-10 14:42:57

标签: c++ templates function-templates

我编写了一个如下所示的通用函数模板,它不构建。

仅当谓词由const referenceby 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);

1 个答案:

答案 0 :(得分:3)

您的电话isAny(boost::bind(&MyRecord::a_,_1)==1);会创建一个临时对象。在C ++中,临时只能绑定到const引用参数或值参数。这个想法是,如果一个函数通过非const引用获取参数,则意味着修改参数,修改临时参数将毫无意义。

FWIW STL按值计算谓词。