正确使用Boost :: ref ..?

时间:2009-07-08 01:29:03

标签: c++ boost

如何编译?错误是当我开始使用boost :: ref()时。我以为boost :: ref用于传递对C ++算法类的引用?

  list<Object> lst;
  lst.push_back(Object(1,2.0f));
  lst.push_back(Object(3,4.3f));

  struct between_1_and_10
  {
    int d;
    void operator() (Object& value) 
    { 
      value.a += 5; value.b -= 3.3f; 
      cout << d << endl;
      d += value.a;
    }
  };

  between_1_and_10 val;
  val.d = 4;
  for_each(lst.begin(), lst.end(), boost::ref(val));   // Problem is here
  printf("rg");

编辑以下是人们建议的编译错误:

1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\algorithm(29) : error C2064: term does not evaluate to a function taking 1 arguments
1>        c:\users\swangrun\desktop\minescout work\feat-000-gettargetimages\minescouttest\maintest.cpp(102) : see reference to function template instantiation '_Fn1 std::for_each<std::list<_Ty>::_Iterator<_Secure_validation>,boost::reference_wrapper<T>>(_InIt,_InIt,_Fn1)' being compiled
1>        with
1>        [
1>            _Fn1=boost::reference_wrapper<main::between_1_and_10>,
1>            _Ty=Object,
1>            _Secure_validation=true,
1>            T=main::between_1_and_10,
1>            _InIt=std::list<Object>::_Iterator<true>
1>        ]

3 个答案:

答案 0 :(得分:12)

boost::reference_wrapperboost::ref返回的内容)不会重载operator()。您可以将boost::bindref一起使用,它具有特殊的处理方式(不使用bind会使for_each复制提供的函数对象)。

但是between_1_and_10 val; val.d = 4; val = for_each(lst.begin(), lst.end(), val); printf("rg"); 返回它调用东西的函数对象。所以就这样做

val

它将调用复制的boost::ref上的内容,并在最后一次调用后返回函数对象。


只是告诉你在哪里使用void g(int &i) { i++; } template<typename T> void run_g(T t) { g(t); } ,因为你似乎在滥用它。想象一个模板,它按值获取其参数,并调用另一个函数:

boost::reference_wrapper

如果您现在想要使用变量调用它,它将复制它。通常,这是一个合理的决定,例如,如果您想将数据作为启动参数传递给线程,则可以将其从本地函数复制到线程对象中。但有时,您可能希望不复制它,而是实际传递引用。这是1帮助的地方。以下实际上是我们所期望的,并输出int main() { int n = 0; run_g(boost::ref(n)); std::cout << n << std::endl; }

T

对于绑定参数,副本是一个很好的默认值。它也很容易使数组和函数衰减到指针(通过引用接受会使{{1}}成为数组/函数类型,并会导致一些讨厌的问题)。

答案 1 :(得分:7)

这就是你真正想要的:

for_each(lst.begin(), lst.end(), boost::bind<void>(boost::ref(val),_1  ) );

编辑:对OP的要求作出一些解释。回想一下for_each()接受一个函数,但你只是传递了一个对你的struct的引用(是的,结构有它的operator()重载但是你没有传递它)。 bind()基本上“暴露”你的struct中的函数。

EDIT2:“_ 1”的说明可以在下面的评论中找到。

答案 2 :(得分:-1)

不使用boost :: ref。

尝试