mem_func和虚函数

时间:2010-12-23 15:17:30

标签: c++ member-function-pointers

我有以下课程:

 class A
{
   public:
        virtual void myfunc(unsigned char c, std::string* dest) = 0;
};

   class B : public class A
{
    public:
        virtual void myfunc(unsigned char c, std::string* dest);
};

void someOtherFunc(const std::string& str,A *pointerFunc)
{
    std::string tmp;
        for_each(str.begin(),
                 str.end(),                 
                 std::bind2nd(std::mem_fun(pointerFunc->myfunc), &tmp));
}

我收到以下编译错误:  错误:没有匹配函数来调用\ u2018mem_fun()\ u2019

你知道为什么吗?

4 个答案:

答案 0 :(得分:1)

您正在寻找std::mem_fun(&A::myfunc)

编辑:你不能在这里使用mem_fun - mem_fun的重载不允许你将两个参数成员函数变成一个仿函数。您将不得不使用类似boost::bind / std::tr1::bind(如果您有TR1)/ std::bind(如果您有C ++ 0x)或者您将不得不使用的内容写自己的仿函数。

请注意,即使mem_fun能够执行此类绑定,std::bind2nd也会失败,因为bind2nd期望一个仿函数接受两个参数,并绑定一个成员函数指针这将产生一个带有三个参数的仿函数。

你有几种解决方法:

  1. 编写自己的算子,做你想做的事。
  2. 编写显式循环而不是std::for_each
  3. 我上面提到的一个尚未标准的活页夹功能(并在@ David的回答中演示)
  4. 首先不要打扰虚函数 - 让你的方法接受普通函数指针并根据函数指针实现。当然,这仅在myfunc不依赖于它所属的类的成员时才有效(在这种情况下,它不应该首先被放入类中)。

答案 1 :(得分:0)

您在此处尝试使用的是使用pointer to a member function将另一个对象的成员函数应用于容器中的每个对象。显然,在这种情况下,没有适配器可以工作。在这种情况下,唯一的解决方案是为它编写一个特殊的包装函数类。

答案 2 :(得分:0)

您的声明并不代表您想要做的事情。

尝试:

void someOtherFunc(const std::string& str)
{
    std::string tmp;

    B BInstance;
    A* ptrToB = &BInstance;


    for_each(str.begin(),
        str.end(),                 
        boost::bind(&A::myfunc, ptrToB, _1, &tmp));
}

这个(或变体)应该做你想要的。

答案 3 :(得分:0)

看看std :: mem_fun背后的实现,你应该能够编写自己的:

编辑(使其“人类可读”)

template<class Result, class Ty, class Arg>
class mem_fun1_t : public binary_function<Ty*, Arg, Result>
{
private:
 Result (Ty::*m_mf)(Arg);

public:
 mem_fun1_t(Result (Ty::*mf)(Arg)) : m_mf(mf) { }

 Result operator()(Ty* pLeft, Arg Right) const {
  return ((pLleft->*m_mf)(Right));
 }
};