我无法弄清楚 mem_fun_ref. 。我必须承认,我通常使用函子来做这种事情,因为它们可以内联以提高速度和利润。然而,这段代码不会成为瓶颈,所以我想尝试一下这个东西。

这是我想做的一个例子。我知道还有其他方法可以做到这一点。我不想使用 copy, ,我不想使用范围成员函数,我不想使用 back_inserter. 。我特别想用 mem_fun_ref. 。这只是一个简单的例子,实际情况要复杂得多。也就是说,我真的不知道为什么这是错误的,但我不熟悉 mem_fun_ref 或者 mem_fun.

这就是我想要的工作:

#include <list>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

int main()
{
    list<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    vector<int> b;

    // should work like magic!
    for_each(a.begin(), a.end(), bind1st(mem_fun_ref(&vector<int>::push_back), b));
}

但我收到 3 个错误:

1>c:\program files\microsoft visual studio 9.0\vc\include\functional(276) : error C2529: '_Right' : reference to reference is illegal
1>c:\program files\microsoft visual studio 9.0\vc\include\functional(281) : error C2529: '_Right' : reference to reference is illegal
1>c:\program files\microsoft visual studio 9.0\vc\include\functional(282) : error C2535: 'void std::binder1st<_Fn2>::operator ()(const int &(&)) const' : member function already defined or declared
1>        with
1>        [
1>            _Fn2=std::mem_fun1_ref_t<void,std::vector<int>,const int &>
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\functional(276) : see declaration of 'std::binder1st<_Fn2>::operator ()'
1>        with
1>        [
1>            _Fn2=std::mem_fun1_ref_t<void,std::vector<int>,const int &>
1>        ]

reference to reference is illegal 让我认为该函数需要按值获取参数。但当然,这是不可能改变的 vector, ,并且也不可能在我的代码中更改它。有没有一个简单的改变可以让它发挥作用?我需要一个单行解决方案。

有帮助吗?

解决方案

只要使用bind。的mem_fun版本太困难了。

for_each(a.begin(), a.end(),
  boost::bind(&vector<int>::push_back, boost::ref(b), _1));

这不需要使用ref的另一种方式是将指针传递到向量进行修改:

for_each(a.begin(), a.end(),
  boost::bind(&vector<int>::push_back, &b, _1));

其他提示

Herb Sutter 在“Exceptional C++ Style”第 28-30 页中解释了这个问题。人们可能无法安全地创建一个指向 vector<int>::push_back 方法,因为需要确保成员函数的准确签名,即使对于 vector<int>::push_back 在标准库中。这是因为(在标准库中):

  1. 具有默认参数的成员函数签名可能会被“两个或多个具有等效行为的成员函数签名”替换。
  2. 成员函数签名可能具有其他默认参数。

最后,赫伯·萨特建议说

  1. 使用 mem_fun,但不能与标准库一起使用
  2. 使用指向成员函数的指针,但不使用标准库

我知道你说你不想使用back_inserter,可能是因为你给了刚刚简单的示例代码。

有关其他人不知道该怎么做的究竟的你正在试图做的,并乐于使用它,使用back_inserter

std::copy(a.begin(), a.end(), std::back_inserter(b));

这是说,总有 other_mem_fun ,我熟起来之前,我知道的推动作用。这可能适合。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top