-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

本当にメンバ関数が 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 に答える