我有一个抽象的函子类,重载操作员()及派生的对象,实现它。

我有一个功能(第一部分的另一类),试图采取一系列的这些函子类,并试图通过一个指件的功能性病的算法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
}

我已经尝试了一些方法,我不能找出如何得到它的工作,我需要使用抽象的类型,因为我可能有不同的源类型,但他们都必须执行相同操作员()(param x)的功能。

我只是需要for_each()function能够呼吁会员功能的运营商()(param x)。我有一个不同的功能,它有具体的实施以及简单地通过一个实例,这些工作的。我想要实现类似的效果,在这里,但不知什么具体的课程,我给出的。

我做错了什么?

有帮助吗?

解决方案

如果我理解你想要做什么,有不少代码中的错误的片段:

  • 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() 如2号的参数。(for_each() 需要一个1-参数功能的指针或功能物体。)

编辑: 基于上 亚历克斯麻的答案, 我推断你可能会有想要的 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]));
    }
}

其他提示

您想这样的事情...

std::for_each(
  it->second.begin(),
  it->second.end(),
  std::bind1st(std::mem_fun(&A::operator()),x)
);

表述“栏。* FN”的计算结果不是规则的,或非成员,函数指针。 所以,你需要调用一个绑定功能(无论是性病:: TR1 ::绑定或升压::绑定)来获得这样的功能。

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

相反,我修改了代码以包括在基类中实现时,将返回仿函数对于每个派生类纯虚函数。我不能想别的,将工作。但它编译这样。

但是,我好奇,如果任何人有一个解决原来的问题,而不必在基类使用纯虚拟的“创建算符”方法。

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