3

我有一个抽象函子类,它重载了 operator() 和实现它的派生对象。

我有一个函数(另一个类的一部分),它试图获取这些仿函数类的数组,并尝试将指向成员函数的指针传递给 std 算法 for_each(),这是我正在做的事情的概述:

编辑:为了清楚起见,我重新清理了它并放置了旧的小例子。

class A{
  operator()(x param)=0;
  operator()(y param)=0;
}

class B: public A{
  operator()(x param); //implemented
  operator()(y param);
}
...// and other derived classes from A

void ClassXYZ::function(A** aArr, size_t aSize)
{
  ...//some code here

  for(size_t i = 0; i< aSize; i++){

    A* x = aArr[i];
    for(v.begin(), v.end(), ...//need to pass pointer/functor to right operator() of x here

..//other code
}

我尝试了几种方法,但不知道如何让它工作,我需要使用抽象类型,因为我可以有不同的派生类型,但它们都必须实现相同的 operator()(param x ) 功能。

我只需要 for_each() 函数就可以调用成员函数 operator()(param x)。我有一个不同的函数,它有具体的实现,只需传递一个实例就可以了。我试图在这里达到类似的效果,但不知道我得到了什么具体的课程。

我究竟做错了什么?

4

4 回答 4

4

你想要这样的东西...

std::for_each(
  it->second.begin(),
  it->second.end(),
  std::bind1st(std::mem_fun(&A::operator()),x)
);
于 2009-09-20T15:31:48.247 回答
3

如果我了解您想要做什么,那么您的代码片段中有很多错误:

  • sizeof aArr是错误的,你需要明确地传递大小(由 ChrisW 注意到)
  • virtual原始声明中缺少说明符operator()()
  • 不知道你的for循环在哪里结束,因为没有匹配}(我怀疑它根本不应该在那里)

下面是一些代码,它将遍历一个A(或A派生的)对象数组并调用operator()每个对象,将传入的参数作为param参数传递:

#include <iostream>
#include <algorithm>
#include <functional>

using namespace std;

typedef double param;      // Just for concreteness

class A {
public:
    virtual void operator()(param x) = 0;
};

class B : public A {
public:
    void operator()(param x) { cerr << "This is a B!  x==" << x << ".\n"; }
};

void function(A** aArr, size_t n, param theParam) {
    void (A::*sFunc)(param x) = &A::operator();
    for_each(aArr, aArr + n, bind2nd(mem_fun(sFunc), theParam));
}

int main(int argc, char** argv) {
    A* arr[] = { new B(), new B(), new B() };

    function(arr, 3, 42.69);

    delete arr[0];
    delete arr[1];
    delete arr[2];
    return 0;
}

mem_fun()需要将 1 参数成员函数指针转换为 2 参数函数对象;bind2nd()然后从中生成一个 1 参数函数对象,该对象将提供的参数固定function()为第二个参数。(for_each()需要一个 1 参数函数指针或函数对象。)

编辑:根据Alex Tingle 的回答,我推断您可能想function()在单个A派生对象上做很多事情。在这种情况下,你会想要这样的东西:

void function(A** aArr, size_t n, vector<param> const& params) {
    for (size_t i = 0; i < n; ++i) {
        void (A::*sFunc)(param x) = &A::operator();
        for_each(params.begin(), params.end(), bind1st(mem_fun(sFunc), aArr[i]));
    }
}
于 2009-09-20T15:47:11.553 回答
1

表达式 "bar.*fn" 不会计算为常规或非成员函数指针。因此,您需要调用绑定函数( std::tr1::bind 或 boost::bind )来获得这样的函数。

于 2009-09-20T15:15:42.417 回答
0

我无法使用当前格式让它工作,我认为它不喜欢我使用指向基成员函数的指针并试图调用这样的派生类实现的事实。

相反,我修改了代码以在基类中包含纯虚函数,这些函数在实现时将为每个派生类返回函子。我想不出还有什么可以用的。但它是这样编译的。

但是我很好奇是否有人可以解决原始问题而不必在基类中使用纯虚拟“创建函子”方法。

于 2009-09-20T18:24:52.860 回答