-1

首先,我知道答案就在某个地方,但我整个上午都在寻找,但没有找到。

我的问题是关于 Java 的样子

abstract class AbstractWorker {
  public abstract int doIt();
}

class Thinker extends AbstractWorker {
  public int doIt() { return 42; }
}

class Milkmaid extends AbstractWorker {
  public int doIt() { return 1 + 2; }
}

class Worker {
  public int getWorkDone(AbstractWorker worker) {
    return worker.doIt();
  }
}

我认为这在 C++ 中也应该是可能的。但是我该如何实现呢?我的方法看起来像

struct AbstractWorker {
  virtual int doIt() = 0;
};

struct Thinker : public AbstractWorker {
  int doIt() { return 42; }
};

struct Milkmaid : public AbstractWorker {
  int doIt() { return 1 + 2; }
};

struct Worker {
  int getWorkDone(AbstractWorker &worker) {
    return worker.doIt();
  }
};

这有什么问题?或者你会如何解决这个问题?

4

2 回答 2

1

如果真的只有一个成员函数,我会用函子实现它并制作getWorkDone一个模板。

struct Worker {
  template<typename F>
  auto getWorkDone(F f) -> decltype(f())
  { return f(); }
};

如果你真的需要对不同的函子进行类型擦除,有std::function.

struct worker1 { int operator()() { return 23; } };
struct worker2 { int operator()() { return 5; } };

std::function<int()> func;
if(/* runtime stuff */ ) func = worker1();
else func = worker2();

Worker w; 
w.getWorkDone(std::ref(func));

函子也可用于维护状态:

template<typename Func>
struct Worker {
  Worker(Func f = Func()) : f_(f) {}

  auto getWorkDone() -> decltype(f_())
  { 
    // do something with the state in f_
    return f_(); 
  }

private:
  Func f_;
};
于 2013-04-30T09:59:43.637 回答
0

我的问题有点可疑。事实上,我发布它有点快。无论如何,我希望有人会发现这很有用。

感谢您的回复。我完善了我的示例,以下内容将实际编译并运行:

#include <iostream>

struct AbstractWorker {
  virtual ~AbstractWorker() {};

  virtual int doIt() = 0;
};

struct Thinker : public AbstractWorker {
  int doIt() { return 42; }
};

struct Milkmaid : public AbstractWorker {
  int doIt() { return 1 + 2; }
};

struct Worker {
  int getWorkDone(AbstractWorker &worker) {
    return worker.doIt();
  }
};

int main() {
  Thinker work1;
  Milkmaid work2;
  Worker worker;

  std::cout << "result of work1: " << worker.getWorkDone(work1) << std::endl;
  std::cout << "result of work2: " << worker.getWorkDone(work2) << std::endl;

  return 0;
}
于 2013-04-30T14:30:53.513 回答